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

时间:2011-03-17 00:47:54

标签: java hibernate spring jpa osgi

我试图让一个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

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

我已经检查过这篇文章的信息:Equinox (OSGi) and JPA/Hibernate - Finding Entities。但是,应用程序使用的是JPA,而不是直接使用Hibernate。应用程序的配置很像这篇文章中的第二个选项:Difference between configuring data source in persistence.xml and in spring configuration files。因此,我没有Hibernate SessionFactory的句柄,它允许我设置annotatedClasses属性。

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

1 个答案:

答案 0 :(得分: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使用类中的注释来完成配置。