在 Tomee Plus (OpenJPA) 上部署 JPA Web 应用程序时出错

问题描述 投票:0回答:1

按照以下步骤在 Tomee Plus 9.1.0 中测试 jackartaee jpa web 应用程序 https://oglimmer.medium.com/tomee-and-jpa-datasources-b95acb8663e4

/conf/tomee.xml:

    <Resource id="testdb" type="DataSource">
        JdbcDriver          org.postgresql.Driver
        JdbcUrl             jdbc:postgresql://server_ip:5432/db
        UserName            postgres
        Password            password
        JtaManaged          true
        DefaultAutoCommit   false
    </Resource>

在 webapp/WEB-INF/persistence.xml 中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="3.0" xmlns="https://jakarta.ee/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence
             https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
    <persistence-unit name="testjpa" transaction-type="JTA" >
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>java:openejb/Resource/testdb</jta-data-source>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

    </persistence-unit>
</persistence>

尝试访问 JPA 时:

EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("testjpa");
EntityManager em = emFactory.createEntityManager();

我收到以下错误:

 null.openjpa.Runtime Starting OpenJPA 3.2.2
<openjpa-3.2.2-re5933d6 fatal user error> org.apache.openjpa.persistence.ArgumentException: The persistence provider is attempting to use properties in the persistence.xml file to resolve the data source. A Java Database Connectivity (JDBC) driver or data source class name must be specified in the openjpa.ConnectionDriverName or javax.persistence.jdbc.driver property. The following properties are available in the configuration: "org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@f4cede5d".
        at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:70)
        at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:925)
        at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:649)
        at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1540)
        at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:531)
        at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:456)
        at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:123)
        at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
        at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:84)
        at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:1113)
        at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:1102)
        at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:657)
        at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:207)
        at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:166)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.doCreateEM(EntityManagerFactoryImpl.java:282)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:201)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:188)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:178)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:64)

非常感谢任何意见。

jpa openjpa apache-tomee
1个回答
0
投票

嗯,事情总是比看起来简单。 显然,使用符合 JPA 的容器(Tomee)你不能简单地

EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("testjpa");
EntityManager em = emFactory.createEntityManager();

您应该始终依赖容器来提供:

 @PersistenceContext(unitName="testdb") private EntityManager em;
© www.soinside.com 2019 - 2024. All rights reserved.