使用Hibernate非托管JPA在Equinox OSGI框架中获取EntityManagerFactory

时间:2013-11-29 20:50:47

标签: java jpa osgi equinox hibernate-entitymanager

我正在开发两个OSGI捆绑,其中 Equinox Eclipse Hibernate / JPA 尝试使用非托管JPA来保留一个实体

第一个包:“Testhibernate”是一个捆绑包,它从hibernates jar导出所有包,并有一个Activator“ org.hibernate.osgi.HibernateBundleActivator ”,它注册一个OSGI服务并使用Equinox标签 Eclipse-BuddyPolicy:已注册

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

当我在OSGI Equinox容器中运行时,如果我使用该方法,那么在第二个障碍中:

emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");

然后我得到了EntityManagerFactory,我可以将我的实体保存在数据库中,并且所有确定

但我在官方的休眠website中读到了下一个:

  

17.4.3。获取EntityMangerFactory

     

hibernate-osgi使用JPA注册OSGi服务   PersistenceProvider接口名称,用于引导和创建   特定于OSGi环境的EntityManagerFactory。这是VITAL   您的EMF是通过服务获得的,而不是创建它   手动。该服务处理已发现的OSGi ClassLoader   扩展点,扫描等。手动创建   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:异常   bundle的testhibernateconfigdao.HibernateJpaActivator.start()   TesthibernateConfigDAO。在   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:544)     在   org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)     在   org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)     在   org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)     在   org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)     在   org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)     在   org.eclipse.osgi.framework.eventmgr.EventManager $ EventThread.run(EventManager.java:340)   引起:javax.persistence.PersistenceException:无法在以下位置配置EntityManagerFactory   org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:387)     在   org.hibernate.osgi.OsgiPersistenceProvider.createEntityManagerFactory(OsgiPersistenceProvider.java:83)     在   de.test.HibernateUtil.getEntityManagerFactory(HibernateUtil.java:29)     在de.test.HibernateUtil.getEntityManager(HibernateUtil.java:18)at   testhibernateconfigdao.HibernateJpaActivator.start(HibernateJpaActivator.java:24)     在   org.eclipse.osgi.framework.internal.core.BundleContextImpl $ 1.run(BundleContextImpl.java:711)     在java.security.AccessController.doPrivileged(Native Method)at   org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)     ... 12更多引起: java.lang.NullPointerException at   org.hibernate.osgi.OsgiScanner.getFilesInJar(OsgiScanner.java:112)     在   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天的时间阅读有关文件的内容,我不知道这是什么问题。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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