Hibernate Annotation O/RM 映射异常

Hibernate Annotation O/RM 映射异常

两个异常: java.lang.NoClassDefFoundError: javax/persistence/Cacheable java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
之所以将他们放在一起说是有原因的,同时此文也算是对该问题的一个总结。


先说第一个异常 java.lang.NoClassDefFoundError: javax/persistence/Cacheable.
其实原因也很明显,说没有找到该类的引用,因为 Cacheable Java Persistence API 2.0 中被规范的一个接口。

解决办法:添加 hibernate-jpa-2.0-api-1.0.0.Final.jar

在说第二个异常 java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z.
此问题出现在使用注解进行一对多的 O/R 映射,大部分网友的说法是因为 javaee.jar 中的部分类与 hibernate-jpa-2.0-api-1.0.0.Final.jar 存在版本冲突导致的,解决的办法是从 Build Path 中移除对 javaEE 的引用。

但事实上不止于此,因为笔者在不存在 javaee.jar 的普通 Java Project 中也出现了这个问题。而且如果在 web 项目中移除 javaEE 也是不易接受的。
解决办法:移除 hibernate-distribution-3.5+ 的引用,改用较稳定的版本,例如: hibernate- distribution-3.3.2.GA-dist 。并且在诸如 3.3.2 等版本下使用 Annotation 进行 O/R 映射是不需要引入 jpa2.0 API 。因此,自然不会出现第一个异常。

总结:具体冲突原因尚不清楚,疑是 Bug 。所以使用一个较为折中的办法,既不会影响 web 程序,又不影响 Annotation 的使用。

 

你可能感兴趣的:(java,Hibernate,javaee,api,jpa,Build)