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

标签 java jpa osgi equinox hibernate-entitymanager

我正在使用 Equinox EclipseHibernate/JPA 开发两个 OSGI 包,试图使用Unmanaged JPA.

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

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

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

emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");

然后我得到了 EntityManagerFactory,我开始将我的实体保存在数据库中,一切都OK

但是我在官方hibernate里面看了website下一个:

17.4.3. Obtaining an EntityMangerFactory

hibernate-osgi registers an OSGi service, using the JPA PersistenceProvider interface name, that bootstraps and creates an EntityManagerFactory specific for OSGi environments. It is VITAL that your EMF be obtained through the service, rather than creating it manually. The service handles the OSGi ClassLoader, discovered extension points, scanning, etc. Manually creating an EntityManagerFactory is guaranteed to NOT work during runtime!

For an example on how to discover and use the service, see the unmanaged-jpa QuickStart's 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: Exception in testhibernateconfigdao.HibernateJpaActivator.start() of bundle TesthibernateConfigDAO. at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734) at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390) at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1176) at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544) at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243) at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438) at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) Caused by: 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) at de.test.HibernateUtil.getEntityManager(HibernateUtil.java:18) at testhibernateconfigdao.HibernateJpaActivator.start(HibernateJpaActivator.java:24) at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) at java.security.AccessController.doPrivileged(Native Method) at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) ... 12 more Caused by: java.lang.NullPointerException at org.hibernate.osgi.OsgiScanner.getFilesInJar(OsgiScanner.java:112) at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:506) at org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:477) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:363) ... 19 more

我花了 3 天多的时间阅读官方文档,但我不明白问题出在哪里。

最佳答案

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

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

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

关于java - 使用 Hibernate 非托管 JPA 在 Equinox OSGI 框架中获取 EntityManagerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20293187/

相关文章:

java - 快速访问嵌套集合

java - spring data Rest Hibernate 将所有表名小写并忽略 @Table ("Name")

java - 如何使用JPA制作Maven包,但独立于服务提供商;稍后如何由该包的用户插入我的服务提供商?

json - JAX-RS + JPA,如何只更新/合并实体字段的一个子集?

java - 在 Apache Felix 中禁用缓存

java - Jackson - 不带括号、逗号和 = 提取数据?

java - 从文件加载公钥数据

java - "Bad version number in .class file"是否有 Maven 插件来检查此错误?

java - OSGi 中的速度 : how to load templates from classpath

java - 在 OSGi 中,被跟踪的服务类型和被跟踪对象的类型有什么区别