×
文章路径: Java

hibernate-jpa与persistence-api冲突

发表于2年前(Apr 18, 2015 9:23:30 AM)  阅读 902  评论 0

分类: Java 开发运维环境

标签: junit javax.persistence.Table.indexes[Ljavax/persistence/Index javax.persistence.JoinColumn.foreignKeyLjavax/persistence/ForeignKey hibernate4.3 persistence-api hibernate-jpa

1、背景

hibernate版本使用的是4.3.8,项目架构是jpa,使用注解注册实体。启动tomcat容器测试时,运行无问题,使用junit运行单元测试时,报出几种错误,网上搜索有如下信息:

错误一
错误信息:javax.persistence.Table.indexes([Ljavax/persistence/Index 
原因:Hibernate4.3不支持@table(name="tablename")
解决方案:使用@entity(name="tablename")代替@table(name="tablename")

错误二
错误信息:javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey
原因:Hibernate4.3在多对一映射的时候不能使用@JoinColumn
解决方案:只写@ManyToOne

错误三
错误信息:javax.persistence.OneToMany.orphanRemoval()Z
原因:javaee、ejb或junit的jar包与hibernate-jpa-2.0-api-1.0.0.Final.jar冲突
解决方案:查看是否存在以上jar包,如果存在,去掉即可

2、分析

笔者最先报出上面的错误一,按照上面的方法,进行修改,报出错误二,再去掉@JoinColumn以及@JoinTable,错误二也解决,但这很不爽,这两点改变都有违笔者的编程习惯,第一个还好,第二个,@JoinTable和@JoinColumn都不能使用的话,意味着不能自定义中间表名和字段名,将采用hibernate默认的命名方法,默认的命名方法除了感觉不爽,还有一个致命的问题,如果两个实体对应的表名过长,生成的中间表将无法创建,超过了数据库允许的表名长度。

网上说这是hibernate4.3的问题,感觉很不科学,而且笔者只有使用junit单元测试时才会出现这种问题。猜测还是jar包冲突引起的。替换了多个版本的junit,甚至将junit降级到3也没解决该问题,后发现笔者项目中有persistence-api-2.0.jar以及hibernate-jpa-2.1-1.0.0.Final.jar,两个包含重复的类,其中就有使用的Annotation,删除persistence-api-2.0.jar后,问题解决,看来使用junit时,他装载的是persistence-api-2.0.jar的类,跑web时装载的又是hibernate-jpa-2.1-1.0.0.Final.jar的类。

另,可以看出,上面说的hibernate4.3不支持这个注解不支持那个注解是错误的,根本问题还是出现在jar包冲突上。

发表评论