I have a simple two table application written in Spring MVC and which uses Hibernate. Everything works perfectly well but if I try to unit test one of the controllers, I get
JoinColumn.foreignKey()
was introduced with JPA 2.1, which was not implemented by Hibernate 4 until version 4.3. If you're using an older version of Hibernate 4 then try upgrading to 4.3.x.
If you're already using Hibernate 4.3 then make sure you're also using JPA 2.1 to make sure the API and implementation match up.
Another workaround can be found here: https://issues.jboss.org/browse/WFCORE-209
workaround 1 update the javaee/api/main.module.xml as followed:
<!--<module name="javax.persistence.api" export="true"/>-->
<module name="javax.persistence.api" export="false"/>
though this is non-portable.
workaround 2
update jboss-deployment-structure.xml as followed:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="jpa" />
</exclude-subsystems>
<exclusions>
<!-- WFCORE-209 workaround -->
<module name="javaee.api" />
<!-- --------------------- -->
<module name="javax.persistence.api" />
<module name="org.hibernate" />
</exclusions>
<dependencies>
<!-- WFCORE-209 workaround -->
<module name="javax.activation.api" export="true"/>
<module name="javax.annotation.api" export="true"/>
<module name="javax.ejb.api" export="true"/>
<module name="javax.el.api" export="true"/>
<module name="javax.enterprise.api" export="true"/>
<module name="javax.enterprise.deploy.api" export="true"/>
<module name="javax.inject.api" export="true"/>
<module name="javax.interceptor.api" export="true"/>
<module name="javax.jms.api" export="true"/>
<module name="javax.jws.api" export="true"/>
<module name="javax.mail.api" export="true"/>
<module name="javax.management.j2ee.api" export="true"/>
<!-- <module name="javax.persistence.api" export="true"/> -->
<module name="javax.resource.api" export="true"/>
<module name="javax.rmi.api" export="true"/>
<module name="javax.security.auth.message.api" export="true"/>
<module name="javax.security.jacc.api" export="true"/>
<module name="javax.servlet.api" export="true"/>
<module name="javax.servlet.jsp.api" export="true"/>
<module name="javax.transaction.api" export="true"/>
<module name="javax.validation.api" export="true"/>
<module name="javax.ws.rs.api" export="true" services="export"/>
<module name="javax.xml.bind.api" export="true"/>
<module name="javax.xml.registry.api" export="true"/>
<module name="javax.xml.soap.api" export="true"/>
<module name="javax.xml.ws.api" export="true"/>
<!-- This one always goes last. -->
<module name="javax.api" export="true"/>
<!-- --------------------- -->
</dependencies>
</deployment>
</jboss-deployment-structure>
this is fully portable
I finally solved this similar problem, there was an old version(hibernate-jpa-2.0-api-1.0.0-Final.jar) in my lib folder which I guess has been preventing maven dependency from loading.
So after I manually deleted it and added (hibernate-jpa-2.1-api-1.0.0-Final.jar) everything started to work.
If you are on JBoss EAP 6.4.x
Chances are it came with the JPA 2.0 and you will need to manually update it to 2.1! Follow the simple steps which worked for me.
Download the JPA 2.1 from maven repository and update the JBoss module http://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api
Copy the file into the JBoss modules directory
Update the module.xml on the same directory