我正在使用Equinox Eclipse和Hibernate/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 天的时间阅读官方文档,但我不明白这是什么问题。