在使用Hibernate注解做映射时,遇到了一个问题:
java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
按照以往的经验通常有几个方向来思考这个问题,其一是少引入了jar包,其二jar包引入了,但是可能版本比较低,还有一种是jar包多引入了,引起了jar包的冲突,低版本和合适版本的都引入了,编译器不知道该使用哪个jar包,这样也会造成上面的原因。
很快排除了上面的第一个原因,通过查询发现Hibernate4.3.11有一个比较重要的特性对JPA2.1的支持,通过查询得知J2EE 7.0才开始支持JPA2.1,开发工具采用的是MyEclipse10.0.7,这个版本并不支持J2EE7.0,最初想到一种解决问题思路,如何引入J2EE 7.0 Libraries,顺着这个问题,但是没有成功,后来选择直接在构建路径中移除了J2EE5.0Libraries,结果采用main方法进行测试创建SessionFactory对象成功了,而且在Java实体类上的注解也没有报错,所以猜测是因为引入的低版本的jar包,而且这个jar包就存在J2EE5.0Libraries中与hibernate框架中的jar包引起了冲突。
最终的解决方案:移除 J2EE5.0 Libraries,或者为工具引入 支持JPA2.1的 J2EE 7.0 Libraries,可能是因为MyEclipse工具优先使用Myeclipse中jar包,而且Hibernate框架中有JPA2.1的jar包hibernate-jpa-2.1-api-1.0.0.Final.jar。
猜想: 框架中hibernate-jpa-2.1-api-1.0.0.Final.jar已经包含javax.persistence包中注解了。 J2EE5.0 Libraries的javax.persistence是按照jpa2.0标准定义的注解 ,这两个jar包产生了冲突,这是我个人的理解也许不完全正确,但是通过移除冲突jar包的解决这个问题来看至少可以佐证我的想法。