I am writing a modules to persist some data and used OpenJPA as the persistence provider. But now I want to give a configuration option for user to switch between OpenJPA and hibernate. So I wrote a new DaoFactory classes to create EntityManagerFactory and created new persistence unit (My-PU-Hibernate) in persistence.xml for hibernate.

Now problem occurs when I create the EntityManagerFactory. My code is,

Persistence.createEntityManagerFactory("My-PU-Hibernate", hibernatePropertyMap);

My persistence.xml

<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="My-PU-OpenJPA" transaction-type="RESOURCE_LOCAL">
        <class>org.example.testproject.jpa.openjpa.entity.AttachmentDAOImpl</class>
    </persistence-unit>

    <persistence-unit name="My-PU-Hibernate" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>org.example.testproject.jpa.openjpa.entity.AttachmentDAOImpl</class>
    </persistence-unit>

</persistence>

My Hibernate property map is,

"hibernate.connection.datasource", datasource
"hibernate.dialect", "org.hibernate.dialect.MySQLDialect"
"hibernate.hbm2ddl.auto","update"
"hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider"
"hibernate.cache.use_query_cache", "false"
"hibernate.cache.use_second_level_cache", "false"

This picks the OpneJPA PersistenceProvider as the correct persistence provider and creates a EntityManagerFactory from OpenJPA persistance provider. It also gives following warning when it is creating the EntityManagerFactory.

WARN   [Start Level Event Dispatcher] openjpa.Runtime - The configuration property named "openjpa.Id" was not recognized and will be ignored, although the name closely matches a valid property called "openjpa.Id".

So when I try to create a entity manager, it gives following error.

<openjpa-2.2.0-wso2v1-r128166:129108 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property. Available properties in configuration are "org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@442ce698".
at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:72)
at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:844)
at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:602)
at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1510)
at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:518)
at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:443)
at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:104)
at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83)
at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:968)
at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:959)
at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:638)
at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203)
at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)

I think above warning and error occurred due to selecting wrong PersistenceProvider. I have debuged the code and verified that hibernate persistence provider also loaded in the OSGI environment. I used geronimo-jpa_2.0_spec v1.0 as javax.persistence vendor.

Any thoughts on how to select correct persistence provider?

有帮助吗?

解决方案

I was able to fix the problem by fixing logic as follows. IMO this is not proper fix as Ejb3Configuration is deprecated. Need to find a proper solution.

//Imports
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.ejb.HibernatePersistence;

//My Logic   
        Ejb3Configuration cfg = new Ejb3Configuration();
        cfg.addAnnotatedClass(AttachmentDAOImpl.class);
        this.entityManagerFactory = cfg.createEntityManagerFactory(propertyMap);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top