Using both OpneJPA and Hibernate in OSGI environment
我正在编写一个模块来保留一些数据,并使用
现在,当我创建EntityManagerFactory时出现问题。我的代码是,
1 | Persistence.createEntityManagerFactory("My-PU-Hibernate", hibernatePropertyMap); |
我的persistence.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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> |
我的Hibernate属性映射为
1 2 3 4 5 6 | "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" |
这将选择OpneJPA
1 | 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". |
因此,当我尝试创建实体管理器时,会出现以下错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <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) |
我认为上述警告和错误是由于选择了错误的PersistenceProvider引起的。我已经调试了代码,并验证了hibernate持久性提供程序也已加载到OSGI环境中。我将
是否有关于如何选择正确的持久性提供程序的想法?
我能够通过如下方法解决逻辑问题。 IMO这是不正确的修复程序,因为Ejb3Configuration已弃用。需要找到适当的解决方案。
1 2 3 4 5 6 7 8 | //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); |