我正在开发两个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天的时间阅读有关文件的内容,我不知道这是什么问题。
答案 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版本并在运行时注意你的软件包的顺序!!