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

使用Hibernate Unmanaged JPA在Equinox OSGI框架中获取EntityManagerFactory

郎羽
2023-03-14

我正在使用Equinox Eclipse和Hibernate/JPA开发两个OSGI包,试图使用Unmanaged JPA持久化一个实体。

第一个捆绑包:“Testhibernate”是一个捆绑包,它从Hibernate罐中导出所有软件包,并具有一个激活器“org.hibernate.osgi.冬眠捆绑激活器”,它注册OSGI服务并使用Equinox标签Eclipse-BuddyPolicy:已注册。

第二个捆绑包:“测试容器配置”只是对第一个捆绑包有一个依赖关系,并且在 Manifest.mf 文件中也有标签 Eclipse-RegisterBuddy:测试隐藏以链接持久性.xml文件。

在第二个错误中,当我在OSGI Equinox容器中运行两者时,如果我使用以下方法:

emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");

然后我得到EntityManagerFactory,并将我的实体正确地保存在数据库中,一切都好了。

但是我在官方Hibernate网站上读到了接下来:

17.4.3.获取EntityMangerFactory

Hibernate-osgi 使用 JPA 持久性提供程序接口名称注册一个 OSGi 服务,该服务引导并创建一个特定于 OSGi 环境的实体管理器工厂。通过服务获取 EMF,而不是手动创建 EMF 至关重要。该服务处理 OSGi 类加载器、发现的扩展点、扫描等。手动创建实体管理器工厂保证在运行时不起作用!

有关如何发现和使用该服务的示例,请参见unmanaged-jpa QuickStart的HibernateUtil.java。

因此,我尝试使用以下方法获取EntityManagerFactory:

Bundle thisBundle = FrameworkUtil.getBundle( HibernateUtil.class );
BundleContext context = thisBundle.getBundleContext();

ServiceReference serviceReference = context.getServiceReference( PersistenceProvider.class.getName() );
PersistenceProvider persistenceProvider = (PersistenceProvider) context.getService( serviceReference );
emf = persistenceProvider.createEntityManagerFactory( "PersistenceProcessDataUnit", null );

我已经对此进行了调试,并且只获得了正确的服务和persistenceProvider对象,但是当我执行最后一次尝试获取EntityManagerFactory时,我得到了错误:

org.osgi.framework。BundleException:testhibernateconfigdao.HibernateJpaActivator中出现异常。捆绑包TesthibernateConfigDAO的start()。位于org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734),位于org.elipse.osgi.framemework.intral.core.BundleContentImpl.sstart(BundeContextImple.java:683),位于org.eclipse.osgi.framework.internal.core.framework.resumeBundle(framework.java:1176),位于org.eclices.osgi.grammework.intal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559),位于.org.eclipse.sogi.framework.internal.core.StartLevelManager.resomeBundlesorg.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243),位于org.eclips.osgi.grammework.intal.core.startLevleManager.dispatchEvent(StartLevel Manager.java:438),位于组织.eclipse.sogi.framework.internal.core.StartleManager.dispatchEvent位于org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)由:javax.persistence引起。PersistenceException:无法在de.test.HibernateUtil.getEntityManagerFactory(hibernate.Util.get EntityManager(HibernateUtil.java:18)的org.hhibernate.osgi.OsgiPersistencProvider.createEntityManagement工厂(OsgiPersistenceProvider.java:83在java.security.AccessController的org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)上测试HibernateJpaActivator.start(HibernateJpaActivator.java:24)。org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)处的doPrivileged(本机方法)…12更多原因:org.hhibernate.osgi.OsgiScanner.getFilesInJar(OsgiScanner.java:112)处的java.lang.NullPointerExceptionorg.hhibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:477)位于org.hhiernate.eqb.Ejb3Configuration.config(Ejb2Configuration.java:363)…19更多

我花了三天多的时间阅读事故文档,但我不知道问题出在哪里。

共有2个答案

有宏峻
2023-03-14

在尝试在Equinox Osgi中使用hibernate几天后,我明白了。我在Hibernate论坛上创建了一个线程,所以你可以去那里:

https://forum.hibernate.org/viewtopic.php?f=1

基本上,您需要逐步完成,设置所需的每个捆绑包,并更新到Hibernate 4.3.0版本,并在运行时注意捆绑包的顺序!

皇甫文乐
2023-03-14

你的设置不起作用。如果可以从创建实体管理器工厂的代码中访问带有单元描述的persistence.xml,则只能创建EMF。在这种情况下,您在不包含persistence.xml的包中创建工厂。NPE可能是hibernate代码中缺少对BundleWiring.listResources的空检查的结果(当然是一个错误),但这仅仅是无法访问持久性单元描述文件的结果。

您应该在TestHibernate包中创建实体管理器工厂,并将EMF注册为服务。然后,DAO包可以查找这个服务并执行它的操作。

顺便说一句:这也是OSGi兼容解决方案在OSGi规范下工作的方式。我建议查看Gemini JPA下载中的示例,并阅读与JPA和JNDI相关的OSGi规范(通过OSGi联盟网站下载)。但也许你已经这么做了。

 类似资料:
  • 问题内容: 如何快速获取rightbarbuttonItem的框架?我发现了这一点:UIBarButtonItem:如何找到它的框架?但是它说不能将NSString转换为UIView,或者不能将NSString转换为String: 目标是删除rightBarButtonItem,添加一个imageView,然后使用fadeOut效果对其进行移动。 谢谢 问题答案: 您应该像这样尝试: 编辑(快速3

  • EasyWeChat 是一个通用的 Composer 包,所以不需要对框架单独做修改,只要支持 Composer 就能直接使用,当然了,为了更方便的使用,我们收集了以下框架单独提供的拓展包: Laravel overtrue/laravel-wechat Symfony lilocon/WechatBundle Yii jianyan74/yii2-easy-wechat 适用于 EasyWeCh

  • QueryList无框架依赖,可以灵活的嵌入到任何项目中去。 在使用Composer管理的项目中安装 在非Composer管理的项目中安装 QueryList可以集成到任何框架中去使用,无需做任何修改,直接使用Composer安装到项目中去即可。 在使用Composer管理的项目中安装 如果项目框架本身就是使用Composer来管理包的话,直接在项目根目录执行Composer安装命令后,即可在项目

  • 在使用Apache POI框架读取excel时,我试图从testng中的dataprovider方法返回一个地图。 我写的代码是这样的 我收到以下错误

  • 我如何使用Flutter以编程方式获取运行我的android应用程序的设备的电话号码? 我知道我们可以使用以下语法在android Studio中轻松做到这一点: 但是如何使用颤振来做到这一点?

  • 我想在@ServerRequestFilter过滤器中打印post请求正文的json日志 但是我发现无论我对entityStream触发器做什么: