java - 将 hyperjaxb3 升级到 jpa 2.1

标签 java hibernate maven jpa hyperjaxb

我正在尝试在使用 maven、jpa、hibernate 和 hyperjaxb 的 eclipse 项目中升级到 JPA 2.1。当我尝试从 eclipse 中执行 Run As..Run on Server 时出现以下错误:

java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

我在项目的根文件夹上运行了 mvn dependency:tree,问题似乎是 hyperjaxb3 使用的是 JPA 2.0,它与 JPA 2.1 冲突。有没有办法让 hyperjaxb3 使用 JPA 2.1?或者是否有其他方法可以解决此错误,以便我的应用程序无需删除 hyperjaxb3 即可享受 JPA 2.1 的优势?

这是我从 mvn dependency:tree 从 windows 命令行在 eclipse 项目的根文件夹中得到的输出:

[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MyApp 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The artifact org.apache.commons:commons-io:jar:1.3.2 has been relocated to commons-io:commons-io:jar:1.3.2
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ MyApp ---
[WARNING] The artifact org.apache.commons:commons-io:jar:1.3.2 has been relocated to commons-io:commons-io:jar:1.3.2
[INFO] org.springframework.samples:MyApp:war:1.0.0-SNAPSHOT
[INFO] +- org.jvnet.hyperjaxb3:hyperjaxb3-ejb-runtime:jar:0.6.0:compile
[INFO] |  +- org.apache.commons:commons-lang3:jar:3.2.1:compile
[INFO] |  \- org.jvnet.jaxb2_commons:jaxb2-basics-runtime:jar:0.8.2:compile
[INFO] +- org.jvnet.hyperjaxb3:hyperjaxb3-ejb-roundtrip:jar:0.6.0:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile
[INFO] |  +- org.jvnet.jaxb2_commons:jaxb2-basics-testing:jar:0.8.2:compile
[INFO] |  |  +- xmlunit:xmlunit:jar:1.0:compile
[INFO] |  |  \- org.jvnet.jaxb2_commons:jaxb2-basics-tools:jar:0.8.2:compile
[INFO] |  |     \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  \- org.slf4j:slf4j-log4j12:jar:1.6.1:compile
[INFO] |     \- log4j:log4j:jar:1.2.16:compile
[INFO] +- org.jadira.usertype:usertype.core:jar:3.1.0.CR8:compile
[INFO] |  \- org.jadira.usertype:usertype.spi:jar:3.1.0.CR8:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.2:provided
[INFO] +- org.springframework.data:spring-data-jpa:jar:1.6.4.RELEASE:compile
[INFO] |  +- org.springframework.data:spring-data-commons:jar:1.8.4.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:4.0.6.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:4.0.6.RELEASE:compile
[INFO] |  +- org.springframework:spring-core:jar:4.0.6.RELEASE:compile
[INFO] |  \- org.slf4j:jcl-over-slf4j:jar:1.7.7:runtime
[INFO] +- org.springframework:spring-jdbc:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:4.0.6.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-webmvc:jar:4.0.6.RELEASE:compile
[INFO] |  +- org.springframework:spring-expression:jar:4.0.6.RELEASE:compile
[INFO] |  \- org.springframework:spring-web:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-tx:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-context-support:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-orm:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-oxm:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework:spring-jms:jar:4.0.6.RELEASE:compile
[INFO] +- org.apache.tomcat:tomcat-jdbc:jar:7.0.42:runtime
[INFO] |  \- org.apache.tomcat:tomcat-juli:jar:7.0.42:runtime
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5:compile
[INFO] +- ch.qos.logback:logback-classic:jar:1.0.13:runtime
[INFO] |  \- ch.qos.logback:logback-core:jar:1.0.13:runtime
[INFO] +- joda-time:joda-time:jar:2.3:compile
[INFO] +- joda-time:joda-time-hibernate:jar:1.3:compile
[INFO] +- joda-time:joda-time-jsptags:jar:1.1.1:compile
[INFO] +- org.jadira.usertype:usertype.jodatime:jar:2.0.1:compile
[INFO] +- mysql:mysql-connector-java:jar:5.1.27:compile
[INFO] +- org.hibernate:hibernate-entitymanager:jar:4.2.1.Final:compile
[INFO] |  +- org.jboss.logging:jboss-logging:jar:3.1.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:4.2.1.Final:compile
[INFO] |  |  \- antlr:antlr:jar:2.7.7:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  +- org.jboss.spec.javax.transaction:jboss-transaction api_1.1_spec:jar:1.0.1.Final:compile
[INFO] |  +- org.javassist:javassist:jar:3.15.0-GA:compile
[INFO] |  \- org.hibernate.common:hibernate-commons-annotations:jar:4.0.1.Final:compile
[INFO] +- org.hibernate:hibernate-validator:jar:5.1.1.Final:compile
[INFO] |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] +- org.hibernate:hibernate-ehcache:jar:4.2.1.Final:compile
[INFO] +- net.sf.ehcache:ehcache-core:jar:2.6.6:compile
[INFO] +- org.webjars:bootstrap:jar:2.3.0:compile
[INFO] +- org.webjars:jquery-ui:jar:1.10.3:compile
[INFO] +- org.webjars:jquery:jar:2.0.3-1:compile
[INFO] +- org.springframework:spring-test:jar:4.0.6.RELEASE:test
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.hamcrest:hamcrest-library:jar:1.3:test
[INFO] +- org.aspectj:aspectjrt:jar:1.7.4:compile
[INFO] +- org.aspectj:aspectjweaver:jar:1.7.4:runtime
[INFO] +- com.github.dandelion:datatables-jsp:jar:0.9.2:compile
[INFO] |  \- com.github.dandelion:datatables-core:jar:0.9.2:compile
[INFO] |     +- com.googlecode.json-simple:json-simple:jar:1.1.1:compile
[INFO] |     \- commons-beanutils:commons-beanutils:jar:1.8.3:compile
[INFO] +- com.github.dandelion:datatables-export-itext:jar:0.9.2:compile
[INFO] |  \- com.itextpdf:itextpdf:jar:5.3.4:compile
[INFO] +- com.github.dandelion:datatables-servlet2:jar:0.9.2:compile
[INFO] +- commons-fileupload:commons-fileupload:jar:1.2:compile
[INFO] +- commons-io:commons-io:jar:1.3.2:compile
[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] +- org.apache.tiles:tiles-jsp:jar:2.1.3:compile
[INFO] |  \- org.apache.tiles:tiles-servlet:jar:2.1.3:compile
[INFO] |     \- org.apache.tiles:tiles-core:jar:2.1.3:compile
[INFO] |        +- org.apache.tiles:tiles-api:jar:2.1.3:compile
[INFO] |        \- commons-digester:commons-digester:jar:1.8.1:compile
[INFO] +- org.springframework.security:spring-security-core:jar:3.2.2.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-web:jar:3.2.2.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-config:jar:3.2.2.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-taglibs:jar:3.2.2.RELEASE:compile
[INFO] |  \- org.springframework.security:spring-security-acl:jar:3.2.2.RELEASE:compile
[INFO] +- org.eclipse.emf:ecore:jar:2.2.3:compile
[INFO] \- org.eclipse.emf:common:jar:2.2.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.805s
[INFO] Finished at: Thu Nov 06 12:32:32 PST 2014
[INFO] Final Memory: 14M/124M
[INFO] ------------------------------------------------------------------------

最佳答案

由于 org.jvnet.hyperjaxb3:hyperjaxb3-ejb-roundtrip,您得到了冲突的 org.hibernate.javax.persistence:hibernate-jpa-2.0-api compile 范围内的依赖项。这实际上是不正确的,should be 提供 代替。 hyperjaxb3-ejb-roundtrip 可以安全地假设提供了 JPA API 和 hyperjaxb3-ejb-runtime。这将在未来的版本中得到纠正。

首先,确保您确实需要 hyperjaxb3-ejb-roundtrip。仅当您生成往返测试用例时才需要 - 这实际上仅适用于“ Playground ”。在生产项目中,您通常不需要这个。因此,您可以很好地关闭往返测试用例生成并删除 hyperjaxb3-ejb-roundtrip 依赖项。

接下来,如果您确实需要hyperjaxb3-ejb-roundtrip,您可以使用Maven 的dependency exclusion 机制。将 hibernate-jpa-2.0-api 依赖项排除在由于 hyperjaxb3-ejb-roundtrip 而被传递排除之外。这看起来像:

<dependency>
    <groupId>org.jvnet.hyperjaxb3</groupId>
    <artifactId>hyperjaxb3-ejb-roundtrip</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果您已经直接包含 hyperjaxb3-ejb-runtime,您也可以将其从 hyperjaxb3-ejb-roundtrip 中排除。

接下来,我刚刚在 this test project 中尝试了 JPA 2.1 兼容性。 .我必须将 hsqldb 更新为 2.3.2 但除此之外,它还适用于 hibernate-entitymanager 版本 4.3.7.Final hibernate-jpa-2.1-api 版本 1.0.0.Final。该测试不是特别具有代表性,但它很好地表明 Hyperjaxb 与 JPA 2.1 兼容。 JPA 2.1 很可能向后兼容 JPA 2.0,因此实际上 Hyperjaxb 生成的代码也应该与 JPA 2.1 兼容。

我现在已经提交了两个问题,一个是 move Hyperjaxb to JPA 2.1 ,另一个到support new JPA 2.1 features .

迁移到 JPA 2.1 应该非常简单,因为它(希望)只需要更新依赖版本,并且在少数情况下(如 hibernate-jpa-2.x-api)还需要 Artifact 编号。 HSQLDB 必须更新到 org.hsqldb:hsqldb 版本 2.3.2 及更高版本,但这没什么大不了的。我将在下一个版本中实现它。

支持新的 JPA 2.1 功能需要做更多的工作。


Now a small side note. When posting links to jumpshare an other external resources, please clearly state the license or a legal status of the linked resource. I will consult pro bono only on sources which could be safely added as tests or samples to the project in the benefit of all users.

关于java - 将 hyperjaxb3 升级到 jpa 2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807530/

相关文章:

java - 服务器 mk-worker 初始化时出错

java - 扩展默认 Maven 原型(prototype)环境变量

java - 将数据从 java 发送到 JasperReports 子数据集

java - 描述 资源路径 位置类型 与元素类型 "p"关联的属性 "p:sessionFactory-ref"的前缀 "beans:bean"未绑定(bind)

java - Maven,多模块项目的Spring配置

java - 如何根据条件使实体中的字段不可编辑-Java/Hibernate

java - org.hibernate.exception.SQLGrammarException : Invalid column name

java - 如何从 JAX RS 注释接口(interface)生成 swagger 规范?

java - Visual Studio代码-Java- Lombok -该类型的方法未定义

java - 如何将数据保存到android中多个按钮的单个值中并将该总值保存在firebase中?