在TomEE Plus(OpenJPA)上部署JPA Web应用报错求助
问题:TomEE Plus 9.1.0中JakartaEE JPA Web应用数据源配置错误
环境与配置
在TomEE Plus 9.1.0中测试JakartaEE JPA Web应用,相关配置如下:
/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)
解决思路
修正JNDI名称匹配:在
tomee.xml的Resource节点添加JndiName属性指定标准名称,示例:<Resource id="testdb" type="DataSource" JndiName="jdbc/testdb"> <!-- 其他配置项不变 --> </Resource>同步修改
persistence.xml中的<jta-data-source>为java:comp/env/jdbc/testdb,遵循Java EE标准JNDI查找路径。确保驱动包正确部署:将PostgreSQL的JDBC驱动jar包放置到TomEE的
lib目录下,而非Web应用的WEB-INF/lib。容器管理的数据源需要容器层面能加载到驱动类,否则OpenJPA无法找到驱动配置。调整OpenJPA配置:在
persistence.xml的<persistence-unit>内添加属性,明确使用容器管理的数据源:<properties> <property name="openjpa.ConnectionFactoryMode" value="managed"/> </properties>该属性会告知OpenJPA直接使用容器提供的数据源,而非尝试自行创建连接。
使用容器注入获取EntityManager:在Java EE环境中,避免手动调用
Persistence.createEntityManagerFactory,改为通过依赖注入获取EntityManager,示例:@PersistenceContext(unitName = "testjpa") private EntityManager em;手动创建工厂会绕开容器的数据源管理逻辑,导致配置无法生效。
检查JTA配置一致性:确认
tomee.xml中的JtaManaged=true与persistence.xml的transaction-type="JTA"配置一致,确保数据源能正常参与容器事务管理。
内容的提问来源于stack exchange,提问作者kosta
相关产品推荐
相关产品推荐

