Search code examples
jpaopenjpaapache-tomee

Error deploying JPA webapp on Tomee Plus (OpenJPA)


Followed these steps to test a jackartaee jpa webapp in Tomee Plus 9.1.0 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>

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

When trying to access JPA :

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

I get the following error:

 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)

Any input is much appreciated.


Solution

  • Well, things are always simpler than they seem. Apparently using an JPA compliant Container (Tomee) you cannot simply

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

    You should always rely on the Container to provide:

     @PersistenceContext(unitName="testdb") private EntityManager em;