我在代码中使用javax.persistence.JoinColumn.foreignKey
。该项目使用WildFly服务器工作正常,但当我使用Jboss EAP 6.1时,它给出了以下错误:
java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax /持久/ ForeignKey的; org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2884) org.hibernate.cfg.AnnotationBinder.bindOneToOne(AnnotationBinder.java:3051) org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1839) org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963) org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796)
当我进一步研究这个问题时,我发现JBoss Library不支持Join列。
但是,我的项目库支持Join列,我打算在我的代码中使用这些库。但是Jboos库似乎覆盖了类路径中的库。
我在jboss-deployment-structure.xml
<exclusions>
<module name="javax.persistence.api"/>
<module name="javaee.api"/>
</exclusions>
但我收到的错误
11:19:55,195 ERROR [org.jboss.msc.service.fail](MSC服务主题1-7)MSC000001:无法启动服务 。jboss.deployment.unit “myappl.war” .PARSE: 服务中的org.jboss.msc.service.StartException jboss.deployment.unit。“myappl.war”.PARSE:JBAS018733:失败了 进程阶段PARSE部署“myappl.war”引起: java.lang.IllegalStateException:JBWS021001:意外的元素 解析处理程序:handler-config
答案 0 :(得分:1)
使用JPA 2.0 API的JBoss EAP 6.x为compliant,而JPA 2.1中添加了javax.persistence.ForeignKey。
为了使其工作,您需要手动集成它。可以找到可能的解决方法here
答案 1 :(得分:0)
此问题的根本原因是EAP 6.3.x基于Java EE 6规范,JPA 2.0是此规范的一部分。最新版本的Hibernate(4.3.x)带有JPA 2.1版,它是Java EE 7规范的一部分。从理论上讲,要解决这个问题,在jboss-deployment-structure.xml文件中排除'org.hibernate'模块和'javax.persistence'就足够了,但它并没有解决问题。根据Red Hat的说法,这是一个BUG。
1)解决方案是使用EAP 6.3.x发行版中存在的Hibernate版本。解决,但不能将应用程序保存到服务器库的版本。
2)另一个解决方案是直接在发行版中将JPA 2.0的版本更改为2.1,位于\ JBOSS_DIST \ modules \ system \ layers \ base \ javax \ persistence \ api \ main中。也解决了,但是这个解决方案是不可接受的,因为使用EAP中存在的Hibernate版本6.3.x的应用程序可能会受到影响。
3)我们可能会按照此地址http://mariemjabloun.blogspot.com.br/2014/03/use-jboss-jpa-21-and-hibernate-43-on.html中的步骤进行操作,但特别是找到了一个非常费力的解决方案。
4)最后,经过大量搜索和尝试,找到了解决问题的合理解决方案,在RedHat的网站上https://access.redhat.com/solutions/404223。我相信未来版本的EAP,应该予以纠正。