[英]How to Get Spring JPA, Hibernate, and OSGi to Play Nice?
我正在尝试获取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中的休眠jar。
我已经检查了有关此帖子的信息: Equinox(OSGi)和JPA / Hibernate-Finding Entities 。 但是,该应用程序正在使用JPA,而不是直接使用Hibernate。 该应用程序的配置与本文中的第二个选项非常相似: 在persistence.xml和spring配置文件中配置数据源之间的区别 。 因此,我在Hibernate SessionFactory上没有可用于设置annotatedClasses属性的句柄。
关于如何克服异常的任何想法?
我与作者并行工作,以后将在这里向任何遇到此问题的人发布我们的解决方案。
抛出异常是因为Hibernate尝试将其jar解压缩以查找持久性类。 就像其他帖子提到的那样,OSGi不允许Hibernate充当类加载器,因此失败了。 解决方案是指定需要手动加载的所有类,然后告诉它不要尝试加载其他任何类。
我们使用了一个persistence.xml
文件和一个orm.xml
文件(我们使用了默认名称,因此我们不必在applicationContext.xml
进行指定)。
我们的persistence.xml
文件只是使用<mapping-file>
标记指向orm.xml
。 它还包括<exclude-unlisted-classes/>
标记,以防止休眠状态尝试加载其他类。
我们的orm.xml
文件使用<entity class="path.to.my.class" metadata-complete="false"/>
调出我们需要加载的每个实体类。 metadata-complete
部分告诉hibernate使用在类中找到的注释来完成配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.