Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate非托管JPA在Equinox OSGI框架中获取EntityManagerFactory_Java_Jpa_Osgi_Equinox_Hibernate Entitymanager - Fatal编程技术网

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

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”只对第一个

我正在用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容器中运行这两个时,如果我使用以下方法:

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论坛中创建了一个线程,您可以访问:

基本上,您需要一步一步地设置您需要的每个捆绑包