首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

javax.persistence.OneToMany.orphanRemoval()Z的另一种原因及解决方法

2012-12-20 
javax.persistence.OneToMany.orphanRemoval()Z的另一种原因及解决办法项目的持久层替换为了Hibernate3.6.

javax.persistence.OneToMany.orphanRemoval()Z的另一种原因及解决办法
项目的持久层替换为了Hibernate3.6.9,本地tomcat启动正常,bamboo自动发布项目到开发服务器(部署到Resin)上,访问项目服务出现:javax.persistence.OneToMany.orphanRemoval()Z异常 。

第一反应是,Maven的配置中存在问题,检查maven的配置,没有发现配置上的问题,软件版本的引用正确。接着到网上搜索,出现最多的答案是:Java EE 5 Libraries和Hibernate的冲突,还有,hibernate-jpa-2.0-api-1.0.0.Final和ejb3-persistence有冲突。但是我们的项目这方面配置没有问题。

接着分析问题的原因,本地启动正确,而开发服务器的启动有问题,差异在于部署的服务器Tomcat和Resin上,检查线上Resin的lib目录中有一个jpa-15.jar,查看这个jar文件只有一个package:javax.persistence,当中包括OneToMany文件,问题明确了。解决的办法是备份jpa-15.jar,然后删除,重新启动resin,访问项目,问题解决。

不负责猜测,Resin提供部分JPA功能,但服务器的版本难和软件版本同步,不知算不算Resin的问题?

问题总结:JavaEE项目中因为class的冲突导致的启动,运行问题比较多,尤其是开发经验较少的时候,非常让人头疼。此类问题,有一种常用的解决办法,可以在运行的代码中,打印出现问题的类路径信息。得到当前类信息的办法,通过Java反射,下面是其中一个方法。
类路径查找方法,打印如下信息:
Class.forName( “package+className” ).getProtectionDomain().getCodeSource().getLocation().getFile();

以javax.persistence.OneToMany为例,我的项目在Windows+Tomcat上,
System.out.println(Class.forName( “javax.persistence.OneToMany” ).getProtectionDomain().getCodeSource().getLocation().getFile());
信息的内容大致如:
D:/apache-tomcat-6.0.32/webapps/*****/WEB-INF/lib/hibernate-jpa-2.0-api-1.0.1.Final.jar
通过以上方法,可以快速的想要定位的类是否正确加载。

原文地址:http://blog.csdn.net/wangjie377/article/details/7282366

热点排行