当前位置: 首页 > 知识库问答 >
问题:

在OSGI环境中同时使用OpneJPA和Hibernate

佟阳飙
2023-03-14

我正在编写一个模块来持久化一些数据,并使用OpenJPA作为持久化提供程序。但是现在我想给用户一个配置选项来在OpenJPAhibernate之间切换。所以我写了一个新的DaoFactory类来创建EntityManagerFactory,并在hibernate的persistence.xml中创建了新的持久性单元(My-PU-Hibernate)。

现在,当我创建EntityManagerFactory时,问题出现了。我的密码是,

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

我的坚持。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>

我的Hibernate属性地图是,

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

这将选择OpneJPAPersistenceProvider作为正确的持久性提供程序,并从OpenJPA持久性提供程序创建EntityManagerFactory。它在创建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".

因此,当我尝试创建实体管理器时,它会给出以下错误。

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

我认为上述警告和错误是由于选择了错误的持久性提供程序而发生的。我已经调试了代码,并验证了Hibernate持久性提供程序也加载在OSGI环境中。我使用geronimo-jpa_2.0_specv1.0作为javax.persistence供应商。

关于如何选择正确的持久性提供程序,您有什么想法吗?

共有1个答案

沈畅
2023-03-14

我能够通过修正逻辑来修正这个问题,如下所示。IMO这不是正确的修复,因为EJB3配置已被弃用。我们需要找到一个合适的解决方案。

//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);
 类似资料:
  • 我试图构建一个使用嵌入式OrientDB(当前为“Memory:”)图形数据库的应用程序。我用的是OrientDB2.2 orientdb-graphdb不应该依赖于一个合适的包,或者包括并导出类吗?

  • 我在mac (OSX小牛)上使用PyCharm运行一个简单的脚本,如下所示。它所做的只是打印< code>PATH变量。我在项目目录中有一个virtualenv。我在PyCharm中添加了一个运行配置,并用不同的Pythons进行了尝试: 当我使用系统默认的python (/usr/bin/python)运行时,它会打印PATH的正确值(即我在。bash_profile文件),它有点长,包含许多目

  • OSGi 支持添加到 Jersey 1.2版。自那之后,您应该能够使用标准 OSGi意味着球衣基于web应用程序运行在 OSGi 运行时中描述的 OSGi 服务平台企业规范。Jersey 目前兼容 OSGi 4.2.0,该规范可以从 OSGi 4.2.0站点下载。 运行OSGi web应用程序的两种支撑方式有: WAB (Web Application Bundle) HTTP Service W

  • A Zen student went up to a hot dog vendor and said: "Make me one with everything". — Joke 环境背景很重要。 如果你想对 Puppet 的配置清单在应用到生产环境之前先进行测试, 你可以使用 Puppet 的 environment 特性来做到。 这可以让你根据环境应用不同的配置清单来设置客户机。例如,你可以定

  • 问题内容: 首先一些背景: 我正在研究一些基于Apache Sling的 webapp原型代码,该代码基于OSGI并在Apache Felix上运行。尽管我认为到目前为止我已经掌握了大多数概念,但我对OSGI还是比较陌生。但是,令我感到困惑的是,我找不到一个“完整的”依赖项注入(DI)框架。我已经使用声明式服务(DS)成功地使用了基本的DI。但是我的理解是DS可以用作参考- 我该如何处理?-OSG

  • 问题内容: 情况如下: 我有一个使用SP作为数据集的SSRS报告。SP创建一个临时表,在其中插入一堆数据,然后选择将其退回以供SSRS报告。挺直截了当的。 问题: 如果多个用户在选择了不同参数的情况下运行报表,SP创建的临时表是否会与tempdb冲突,并可能无法返回预期的数据集? 问题答案: 很有可能不会。如果将临时表定义为或,那么您是安全的,因为这类临时表只能由创建连接访问,并且仅在存储过程执行