如何让Spring JPA,Hibernate和OSGi发挥出色?

Ada*_*dam 8 java spring osgi hibernate jpa

我试图获取一个WAR文件在Karaf OSGi容器内运行.应用程序在独立的Jetty 6.1.26中正确运行,但是当应用程序在Karaf中运行时,我得到以下异常并且Karaf实例冻结:

WARN  org.hibernate.ejb.packaging.InputStreamZippedJarVisitor - Unable to find 
file (ignored): bundle://125.0:240/ java.lang.NullPointerException: in is null
Run Code Online (Sandbox Code Playgroud)

请注意,应用程序不依赖于单独的OSGi包中的Hibernate; 它包括WEB-INF/lib中的hibernate jar.

我已经检查了这篇文章的信息:Equinox(OSGi)和JPA/Hibernate - Finding Entities.但是,应用程序使用的是JPA,而不是直接使用Hibernate.应用程序的配置很像本文中的第二个选项:在persistence.xml和spring配置文件中配置数据源之间的区别.因此,我没有Hibernate SessionFactory的句柄,它允许我设置annotatedClasses属性.

关于如何通过例外的任何想法?

Jon*_*on7 4

我与作者同时工作,我将在这里为将来遇到此问题的任何人发布我们的解决方案。

抛出异常是因为 Hibernate 尝试解压缩它的 jar 以查找持久性类。正如其他帖子提到的,OSGi 不允许 Hibernate 充当类加载器,因此这会失败。解决方案是指定需要手动加载的所有类,然后告诉它不要尝试加载其他任何内容。

我们使用了一个persistence.xml文件和一个orm.xml文件(我们使用了默认名称,因此我们不必在我们的 中指定applicationContext.xml)。

我们的persistence.xml文件只是指向orm.xml使用<mapping-file>标签。它还包含<exclude-unlisted-classes/>防止 hibernate 尝试加载其他类的标记。

我们的orm.xml文件用于<entity class="path.to.my.class" metadata-complete="false"/>调出我们需要加载的每个实体类。该metadata-complete部分告诉 hibernate 使用类中找到的注释来完成配置。