2

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

第一个包:“Testhibernate”是一个包,它从休眠 jar 中导出所有包,并具有一个激活器“ org.hibernate.osgi.HibernateBundleActivator ”,它注册了一个 OSGI 服务并使用 Equinox 标记Eclipse-BuddyPolicy:registered

第二个包:“TesthibernateConfigDAO”只是对第一个包有依赖关系,并且在 Manifest.mf 文件中具有标记Eclipse-RegisterBuddy: Testhibernate以链接 persistence.xml 文件。

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

emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");

然后我得到 EntityManagerFactory 并且我可以将我的实体直接保存在数据库中,一切都很好

但我在官方hibernate网站上阅读了下:

17.4.3. 获取 EntityMangerFactory

hibernate-osgi 使用 JPA PersistenceProvider 接口名称注册一个 OSGi 服务,该服务引导并创建一个特定于 OSGi 环境的 EntityManagerFactory。至关重要的是,您的 EMF 通过服务获得,而不是手动创建。该服务处理 OSGi 类加载器、发现的扩展点、扫描等。手动创建 EntityManagerFactory 保证在运行时不起作用!

有关如何发现和使用服务的示例,请参阅 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的testhibernateconfigdao.HibernateJpaActivator.start()中的异常。在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 在 org.eclipse .osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390) 在 org.eclipse.osgi.framework .internal.core.Framework.resumeBundle(Framework.java:1176) 在 org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) 在 org.eclipse.osgi.framework.internal.core .StartLevelManager.resumeBundles(StartLevelManager.java: 原因:javax.persistence.PersistenceException: Unable to configure EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:387) at org.hibernate.osgi.OsgiPersistenceProvider.createEntityManagerFactory(OsgiPersistenceProvider.java:83) at de。 test.HibernateUtil.getEntityManagerFactory(HibernateUtil.java:29) 在 de.test.HibernateUtil.getEntityManager(HibernateUtil.java:18) 在 testhibernateconfigdao.HibernateJpaActivator.start(HibernateJpaActivator.java:24) 在 org.eclipse.osgi.framework.internal org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) 的 java.security.AccessController.doPrivileged(Native Method) 的 .core.BundleContextImpl$1.run(BundleContextImpl.java:711) 。 .. 12 更多原因:java.lang.NullPointerException 在 org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:506 ) 在 org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan( Ejb3Configuration.java:477) 在 org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:363) ... 19 更多

而且我花了超过 3 天的时间阅读官方文档,但我不明白这是什么问题。

4

2 回答 2

1

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

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

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

于 2013-12-01T13:39:20.793 回答
0

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

https://forum.hibernate.org/viewtopic.php?f=1&t=1029974&p=2473673#p2473673

基本上你需要一步一步地设置你需要的每个包,并且更新到 Hibernate 4.3.0 版本,并注意你的包在运行时的顺序!!

于 2013-12-11T12:14:07.990 回答