Java 为什么我们必须在persistence.xml中提供数据库凭据

Java 为什么我们必须在persistence.xml中提供数据库凭据,java,jakarta-ee,jpa,jpa-2.0,Java,Jakarta Ee,Jpa,Jpa 2.0,我们正在使用JPA2.0,我们在websphere中创建了数据源,并试图通过J2SE应用程序访问数据库。我们收到无效的用户名和密码错误。如果我们在persistence.xml中提供用户名和密码,它就可以正常工作 请任何人解释一下,既然我们有数据源,为什么我们必须在persistence.xml中提供DB凭据 注意:数据源已成功创建,测试成功 persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence

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

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

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

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>

jdbc/TestDataSource

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

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


oracle.toplink.essentials.PersistenceProvider
jdbc/MyDataSource
如果未在应用程序容器端配置数据源,则可以在应用程序端自行设置。例如,您需要许多应用程序,每个应用程序都有自己的数据库连接配置

<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>

oracle.toplink.essentials.PersistenceProvider
假的

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

在websphere中,数据源的配置似乎不正确。通过websphere控制台验证配置

有两种方法可以获得
连接
。如果您通过属性提供凭据,那么您的jpa实现似乎使用了
DataSource.getConnection(字符串用户名、字符串密码)


连接属性打算在JavaSE环境中使用。在JEE中,您应该更喜欢JNDI查找。请参阅JPA2.0规范的一节。

显然,如果我不得不相信发布的persistence.xml文件,OP就是这么做的。注意这里的jta数据源行。你能再解释一下吗?我不明白你的意思。请放心,如果一切都设置正确,这只是工作。数据源连接在被JPA引用时不会表现出神奇的不同,这一切都是一样的。所以,在你的期望中,有些地方出了问题;错误的数据库、错误的数据源、类路径上错误的persistence.xml等。
<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>