Java 使用Hibernate非托管JPA在Equinox OSGI框架中获取EntityManagerFactory
我正在用Equinox Eclipse和Hibernate/JPA开发两个OSGI包,试图使用非托管JPA来持久化一个实体 第一个包:“Testhibernate”是一个从hibernates JAR导出所有包的包,它有一个激活器“org.hibernate.osgi.HibernateBundleActivator”,用于注册osgi服务,并使用Equinox标记EclipseBuddyPolicy:registered 第二个捆绑包:“TesthibernateConfigDAO”只对第一个捆绑包有依赖关系,并且在Manifest.mf文件中有标记Eclipse RegisterBuddy:Testhibernate链接persistence.xml文件 在第二个错误中,当我在OSGI Equinox容器中运行这两个时,如果我使用以下方法:Java 使用Hibernate非托管JPA在Equinox OSGI框架中获取EntityManagerFactory,java,jpa,osgi,equinox,hibernate-entitymanager,Java,Jpa,Osgi,Equinox,Hibernate Entitymanager,我正在用Equinox Eclipse和Hibernate/JPA开发两个OSGI包,试图使用非托管JPA来持久化一个实体 第一个包:“Testhibernate”是一个从hibernates JAR导出所有包的包,它有一个激活器“org.hibernate.osgi.HibernateBundleActivator”,用于注册osgi服务,并使用Equinox标记EclipseBuddyPolicy:registered 第二个捆绑包:“TesthibernateConfigDAO”只对第一个
emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");
然后我得到EntityManagerFactory,我可以将我的实体保存在数据库中,一切正常
但我在第二天的官方冬眠中读到:
17.4.3。获取EntityRangerFactory
hibernate osgi使用JPA注册osgi服务
PersistenceProvider接口名称,用于引导和创建
特定于OSGi环境的EntityManagerFactory。至关重要的是
您的EMF可以通过服务获得,而不是创建服务
手动。该服务处理OSGi类加载器
手动创建扩展点、扫描等
EntityManagerFactory保证在运行时不工作
有关如何发现和使用服务的示例,请参阅
非托管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.start()
测试HibernateConfigdao。在
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.startevelmanager.resumeBundles(startevelmanager.java:559)
在
org.eclipse.osgi.framework.internal.core.startevelmanager.resumeBundles(startevelmanager.java:544)
在
org.eclipse.osgi.framework.internal.core.startevelmanager.incFWSL(startevelmanager.java:457)
在
org.eclipse.osgi.framework.internal.core.startevelmanager.dosetstartevel(startevelmanager.java:243)
在
org.eclipse.osgi.framework.internal.core.startEvelManager.dispatchEvent(startEvelManager.java:438)
在
org.eclipse.osgi.framework.internal.core.startEvelManager.dispatchEvent(startEvelManager.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)
在
getEntityManagerFactory(HibernateUtil.java:29)
位于de.test.HibernateUtil.getEntityManager(HibernateUtil.java:18)
testhibernateconfigdao.HibernateJpaActivator.start(HibernateJpaActivator.java:24)
在
org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
位于java.security.AccessController.doPrivileged(本机方法)
org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
... 另外12个原因是:java.lang.NullPointerException在
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个
我花了三天多的时间阅读事故记录,但我不明白问题出在哪里。您的设置无法正常工作。如果可以从创建实体管理器工厂的代码中访问带有单元描述的persistence.xml,则只能创建EMF。在本例中,您将在不包含persistence.xml的包中创建工厂。NPE可能是BundleWiring.listResources的hibernate代码中缺少空检查的结果(当然是一个bug),但这仅仅是无法访问持久性单元描述文件的结果 您应该在TestHibernate捆绑包中创建实体管理器工厂,并将EMF注册为服务。然后,DAO包可以查找此服务并执行其操作
顺便说一下:考虑到OSGi规范,这也是OSGi兼容解决方案的工作方式。我建议查看下载中的示例,并阅读与JPA和JNDI相关的OSGi规范(通过网站下载)。但也许你已经这么做了。在Equinox Osgi中尝试使用hibernate几天后,我明白了。我在Hibernate论坛中创建了一个线程,您可以访问: 基本上,您需要一步一步地设置您需要的每个捆绑包