【问题标题】:Why do we have to give database credentials in persistence.xml为什么我们必须在 persistence.xml 中提供数据库凭据
【发布时间】:2014-01-02 12:01:10
【问题描述】:

我们正在使用JPA 2.0,我们在 websphere 中创建了数据源并尝试通过 J2SE 应用程序访问数据库。我们收到无效的用户名和密码错误。如果我们在persistence.xml 中提供用户名和密码,它就可以正常工作。

请任何人解释一下,既然我们有数据源,为什么我们必须在 persistence.xml 中提供数据库凭据。

注意:数据源创建成功,测试成功。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
      xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

      <persistence-unit name="Printer">

            <jta-data-source>jdbc/TestDataSource</jta-data-source>

            <properties>
                  <property name="openjpa.Optimistic" value="false" />
                  <property name="openjpa.LockManager" value="pessimistic" />
                  <property name="javax.persistence.jdbc.user" value="admin" />
                  <property name="javax.persistence.jdbc.password" value="admin#2" />
                </properties>

      </persistence-unit>
</persistence>

【问题讨论】:

  • 请放心,如果一切设置正确,这将正常工作。当 JPA 引用数据源连接时,它不会神奇地表现出不同的行为,它们都是一样的。因此,在您的期望中,有些地方出了问题;错误的数据库、错误的数据源、错误的类路径中的 persistence.xml 等。

标签: java jakarta-ee jpa jpa-2.0


【解决方案1】:

似乎 websphere 中的数据源配置不正确。 Test the database connection通过websphere控制台验证配置。

DataSource 有两种获取Connection 的方法。如果您通过属性提供凭据,您的 jpa 实现似乎使用 DataSource.getConnection(String username, String password)

连接属性旨在用于 Java SE 环境。在 JEE 中,您应该更喜欢 JNDI 查找。请参阅 JPA 2.0 规范的 8.2.1.9 部分。

【讨论】:

    【解决方案2】:

    您无需在应用程序中指定凭据。只需通过 JNDI 访问您的数据库,指定您在 WS 中创建的数据源的名称。

    一种方法是使用预先配置的数据源来配置持久性单元(请仔细检查它是否配置正确 - 测试功能在 WS 中可用)

    <persistence-unit name="default" transaction-type="JTA">
        <provider>
            oracle.toplink.essentials.PersistenceProvider
        </provider>
        <jta-data-source>
            jdbc/MyDataSource
        </jta-data-source>
        <properties>
            <property name="toplink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
    

    如果应用容器端没有配置数据源,可以在应用端自己设置。例如,您需要多个应用程序,每个应用程序都有自己的数据库连接配置。

    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
        <provider>
            oracle.toplink.essentials.PersistenceProvider
        </provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="toplink.logging.level" value="INFO"/>
            <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
            <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@myhost:l521:MYSID"/>
            <property name="toplink.jdbc.password" value="tiger"/>
            <property name="toplink.jdbc.user" value="scott"/>
        </properties>
    </persistence-unit>
    

    您的 persistence.xml 具有两种方式的配置。删除不必要的代码,然后重试。

    【讨论】:

    • 如果我不得不相信发布的 persistence.xml 文件,显然这就是 OP 正在做的事情。注意那里的 jta-data-source 行。
    • 你能解释一下吗?我不明白你的意思。
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多