обновить гиперджаксб3 до jpa 2.1

Я пытаюсь перейти на JPA 2.1 в проекте eclipse, в котором используются maven, jpa, hibernate и hyperjaxb. Я получаю следующую ошибку, когда пытаюсь сделать Run As..Run on Server из eclipse:

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

Я запустил mvn dependency:tree в корневой папке проекта, и проблема, похоже, в том, что hyperjaxb3 использует JPA 2.0, который конфликтует с JPA 2.1. Есть ли способ заставить hyperjaxb3 использовать JPA 2.1? Или есть другой способ устранить эту ошибку, чтобы мое приложение могло пользоваться преимуществами JPA 2.1 без необходимости удалять hyperjaxb3?

Вот вывод, который я получил от mvn dependency:tree в корневой папке проекта eclipse из командной строки Windows:

[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] ------------------------------------------------------------------------

person CodeMed    schedule 07.11.2014    source источник
comment
Не могли бы вы указать, какую зависимость JPA 2.1 вы хотите использовать? Я имею в виду groupId:artifactId.   -  person lexicore    schedule 07.11.2014
comment
Хорошо, я предполагаю, что org.hibernate.javax.persistence:hibernate-jpa-2.1-api и затем org.hibernate:hibernate-entitymanager:4.3.7.Final.   -  person lexicore    schedule 07.11.2014


Ответы (1)


Вы получаете конфликтующий org.hibernate.javax.persistence:hibernate-jpa-2.0-api из-за зависимости org.jvnet.hyperjaxb3:hyperjaxb3-ejb-roundtrip, которая имеет его в области compile. На самом деле это неверно, вместо этого должно быть provided. hyperjaxb3-ejb-roundtrip может с уверенностью предположить, что предоставляется JPA API, а также hyperjaxb3-ejb-runtime. Это будет исправлено в будущем релизе.

Прежде всего, убедитесь, что вам действительно нужен hyperjaxb3-ejb-roundtrip. Это необходимо только в том случае, если вы создаете тестовый пример туда и обратно, который на самом деле предназначен только для «игровой площадки». В производственных проектах это обычно не требуется. Таким образом, вы вполне можете отключить генерацию тестовых случаев туда и обратно и удалить зависимость hyperjaxb3-ejb-roundtrip.

Далее, если вам нужно hyperjaxb3-ejb-roundtrip, вы можете использовать механизм Maven для исключение зависимостей, чтобы исключить транзитивное исключение зависимости 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.

Затем я только что попробовал совместимость с 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.

Теперь я зарегистрировал две проблемы: одну просто для переместить Hyperjaxb на JPA 2.1, другую чтобы поддерживать новые функции JPA 2.1.

Переход на JPA 2.1 должен быть довольно простым, поскольку (надеюсь) потребуется только обновить версии зависимостей, а в некоторых случаях (например, hibernate-jpa-2.x-api) также идентификаторы артефактов. HSQLDB необходимо обновить до org.hsqldb:hsqldb версии 2.3.2 и выше, но в этом нет ничего страшного. Я реализую это в следующем выпуске.

Поддержка новых функций JPA 2.1 — это гораздо больше работы.


Теперь маленькое примечание. Размещая ссылки на другие внешние ресурсы, пожалуйста, четко указывайте лицензию или юридический статус связанного ресурса. Я буду консультироваться на безвозмездной основе только по источникам, которые можно безопасно добавить в проект в качестве тестов или образцов в интересах всех пользователей.

person lexicore    schedule 08.11.2014