NoSuchMethodError:javax.persistence.JoinColumn.foreignKey()

我正在尝试在OpenShift(JBoss企业应用程序平台6)上部署我的应用程序,并且我得到了标题中提到的NoSuchMethodError。 所以我搜索了整个事情并发现了一些文章或线程,提到自JPA-API 2.1以来这个方法是可用的。 我发现Openshift所需的依赖包含JPA-API 2.0。 我试图排除这种依赖,但它不起作用。 有任何想法吗? 请在下面找到pom.xml。

 4.0.0 christmasmarkets christmasmarkets war 1.0 christmasmarkets   eap http://maven.repository.redhat.com/techpreview/all  true   true    springsource-repo SpringSource Repository http://repo.springsource.org/release     eap http://maven.repository.redhat.com/techpreview/all  true   true     UTF-8 1.6 1.6 4.1.2.RELEASE 4.3.7.Final 3.5.6-Final 3.2.0.Final 2.2.3 9.3-1102-jdbc41    org.jboss.spec jboss-javaee-6.0 3.0.2.Final-redhat-4 pom provided   org.hibernate.javax.persistence hibernate-jpa-2.0-api     org.springframework spring-context ${spring.version}   org.springframework spring-web ${spring.version}   org.springframework spring-webmvc ${spring.version}   org.springframework spring-tx ${spring.version}   org.springframework spring-orm ${spring.version}   com.fasterxml.jackson.core jackson-core ${jackson.version}   com.fasterxml.jackson.core jackson-databind ${jackson.version}   com.fasterxml.jackson.core jackson-annotations ${jackson.version}   org.hibernate hibernate-entitymanager ${hibernate.version}   org.postgresql postgresql ${postgre.version}         openshift  christmasmarkets   maven-war-plugin 2.1.1  deployments ROOT       

这里的问题是容器在运行时提供JPA 2.0。 在pom.xml排除提供的依赖项仅在编译时有效。 要解决此问题,您必须在容器中配置类加载。

OpenShift JavaEE 6支持基于JBoss AS 7.来自AS7文档中的类加载 :

jboss-deployment-structure.xml是一个特定于JBoss的部署描述符,可用于以细粒度的方式控制类加载。 它应该放在META-INF(或Web部署的WEB-INF)的顶级部署中。 它可以执行以下操作:

  Prevent automatic dependencies from being added Add additional dependencies ... 

所以你需要的是添加一个自定义的jboss-deployment-structure.xml文件来排除hibernate-jpa-2.0-api自动添加。

基于OpenShift的文档 :

        

将此Maven依赖项添加到您的pom.xml:

  org.hibernate.javax.persistence hibernate-jpa-2.1-api 1.0.0.Final