【发布时间】:2013-12-16 02:07:42
【问题描述】:
我正在使用 Equinox Eclipse 和 Hibernate/JPA 开发 两个 OSGI 包,试图使用 Unmanaged JPA 持久化一个实体强>。
第一个包:“Testhibernate”是一个包,它从休眠 jar 中导出所有包,并具有一个注册 OSGI 服务并使用的激活器“org.hibernate.osgi.HibernateBundleActivator” Equinox 标记 Eclipse-BuddyPolicy: 已注册。
第二个包:“TesthibernateConfigDAO”只是对第一个包有一个依赖项,并且在 Manifest.mf 文件中具有标签 Eclipse-RegisterBuddy: Testhibernate 以链接 persistence.xml 文件。
当我在 OSGI Equinox 容器中同时运行这两个错误时,如果我使用以下方法:
emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");
然后我得到 EntityManagerFactory 并将我的实体直接保存在数据库中,一切都OK。
但是我在官方hibernatewebsite看了下:
17.4.3。获取EntityMangerFactory
hibernate-osgi 使用 JPA 注册一个 OSGi 服务 PersistenceProvider 接口名称,它引导并创建一个 EntityManagerFactory 特定于 OSGi 环境。至关重要的是 您的 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.HibernateJpaActivator.start() 的 bundle 测试休眠配置DAO。在 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) 在 testhibernateconfigdao.HibernateJpaActivator.start(HibernateJpaActivator.java:24) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 在 java.security.AccessController.doPrivileged(Native Method) 在 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 天的时间阅读官方文档,但我不明白这是什么问题。
【问题讨论】:
标签: java jpa osgi equinox hibernate-entitymanager