You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:56:33