Maven: неправильная версия Hibernate?

1

Я встречаю ошибку, которая должна быть исправлена: isMember on @ElementCollection throws QuerySyntaxException: unexpected end of subtree

Я искал эту проблему и нашел билет HHH-5799 и HHH-5209, где, как утверждается, он был разрешен в Hibernate 4.1.8, 4.3.0.Beta1.

Я пытаюсь запросить ProductType одним из его штрих-кодов.

Мой объект выглядит следующим образом:

@Entity
@XmlRootElement
public class ProductType implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    @ElementCollection
    private List<String> barcodes = new LinkedList<String>();

    ... getters+setters
}

Я использую критерии api для запроса типа продукта по штрих-коду с помощью этого кода:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ProductType> c = cb.createQuery(ProductType.class);
Root<ProductType> f = c.from(ProductType.class);
c.select(f).where(cb.isMember(barcode, f.get(ProductType_.barcodes)));
TypedQuery<ProductType> query = em.createQuery(c);
return query.getSingleResult();

Я сделал простой тест:

@Test
public void testProductTypeWithMultipleBarcodes()
{
    ProductType type = new ProductType();
    List<String> barcodes = new LinkedList<String>();
    barcodes.add("1234561");
    barcodes.add("1234562");
    barcodes.add("1234563");
    type.setBarcodes(barcodes);
    em.persist(type);
    em.flush();

    assertEquals(type, productRepository.findProductTypeByBarcode("1234561"));
    assertEquals(type, productRepository.findProductTypeByBarcode("1234562"));
    assertEquals(type, productRepository.findProductTypeByBarcode("1234563"));
}

Но я получаю org.hibernate.hql.internal.ast.QuerySyntaxException:

Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected end of subtree [select generatedAlias0 from cz.nuc.skladnik.storagecycle.product.ProductType as generatedAlias0 where :param0 member of generatedAlias0.barcodes] [Proxied because : Original exception not deserilizable, ClassNotFoundException]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.generate(QueryTranslatorImpl.java:238)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:487)

До исключения я вижу:

00:40:44,965 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http--0_0_0_0_0_0_0_0-8080-1) <AST>:0:0: unexpected end of subtree: <AST>:0:0: unexpected end of subtree
at org.hibernate.hql.internal.antlr.SqlGeneratorBase.selectClause(SqlGeneratorBase.java:490) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]

упоминание hibernate-core-4.0.1.Final. Поэтому я попытался добавить зависимость от hibernate-core в моем pom без результата:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.1.Final</version>
</dependency>

Полный pom.xml находится здесь: http://pastebin.com/8U30fPpn

Я думаю, что hibernate-core-4.0.1.Final затянут другой зависимостью. Является ли этот источник моей проблемы? И если да, то есть какой-то способ узнать, какая зависимость - черная овца?

Мой контейнер JBoss 7.1.1, и я использую Arquillian для тестов. В качестве IDE я использую IntelliJ Idea 13.

mvn dependency:tree: http://pastebin.com/k4YM1DpY

UPDATE: Я узнал, что hibernate 4.0.1 был затянут сервером JBoss. Поэтому я попытался убрать Hibernate, используя это обновление баннеров Hibernate 4.x для другой версии Hibernate 4.x

Однако после этого я получаю NoClassDefFoundError: org/jboss/as/jpa/hibernate4/JBossAppServerJtaPlatform.

00:18:36,088 ERROR [org.jboss.as.controller.management-operation] JBAS014612: Operation ("parallel-extension-add") failed - address: ([]): java.lang.RuntimeException: JBAS014670: Failed initializing module org.jboss.as.jpa
at org.jboss.as.controller.extension.ParallelExtensionAddHandler$1.execute(ParallelExtensionAddHandler.java:99) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:385) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractOperationContext.doCompleteStep(AbstractOperationContext.java:272) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractOperationContext.completeStep(AbstractOperationContext.java:200) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.ModelControllerImpl.boot(ModelControllerImpl.java:149) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractControllerService.boot(AbstractControllerService.java:190) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.ServerService.boot(ServerService.java:291) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.ServerService.boot(ServerService.java:266) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:155) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]
Caused by: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: org/jboss/as/jpa/hibernate4/JBossAppServerJtaPlatform
at java.util.concurrent.FutureTask.report(FutureTask.java:122) [rt.jar:1.7.0_51]
at java.util.concurrent.FutureTask.get(FutureTask.java:188) [rt.jar:1.7.0_51]
at org.jboss.as.controller.extension.ParallelExtensionAddHandler$1.execute(ParallelExtensionAddHandler.java:91) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
... 9 more
Caused by: java.lang.NoClassDefFoundError: org/jboss/as/jpa/hibernate4/JBossAppServerJtaPlatform
at org.jboss.as.jpa.hibernate4.HibernatePersistenceProviderAdaptor.injectJtaManager(HibernatePersistenceProviderAdaptor.java:59)
at org.jboss.as.jpa.processor.PersistenceProviderAdaptorLoader.loadPersistenceAdapterModule(PersistenceProviderAdaptorLoader.java:112)
at org.jboss.as.jpa.subsystem.JPAExtension.initialize(JPAExtension.java:118)
at org.jboss.as.controller.extension.ExtensionAddHandler.initializeExtension(ExtensionAddHandler.java:88) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.extension.ParallelExtensionAddHandler$ExtensionInitializeTask.call(ParallelExtensionAddHandler.java:127) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.extension.ParallelExtensionAddHandler$ExtensionInitializeTask.call(ParallelExtensionAddHandler.java:113) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]
at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.0.0.GA.jar:2.0.0.GA]
Caused by: java.lang.ClassNotFoundException: org.jboss.as.jpa.hibernate4.JBossAppServerJtaPlatform from [Module "org.jboss.as.jpa.hibernate:4" from local module loader @4e66ae7 (roots: d:\Programy\jboss-as-7.1.1.Final\modules)]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) [jboss-modules.jar:1.1.1.GA]
... 11 more
Теги:
maven
hibernate
jpa
jboss

2 ответа

1

Если вы каким-то образом вытаскиваете два org.hibernate:hibernate-core, посредничество зависимости должно начинать и выбирать. И нет никаких признаков того, что вы делаете два артефакта Hibernate с разными координатами из вашей dependency:tree выход dependency:tree. Таким образом, это звучит скорее как неправильно сконструированный проект, чем адский JAR как таковой, т.е. Вы пытаетесь найти конфликтующие библиотеки. Если вы хотите быть абсолютно уверенным, проверьте наличие дубликатов файлов в вашем пути к классам, используя

mvn com.ning.maven.plugins:maven-duplicate-finder-plugin:1.0.4:check

который является хорошим плагином JAR-ада.

Ваш файл POM и dependency:tree вывод dependency:tree показывает версии JBoss и Hibernate как RELEASE. Я не знаю, что это за вещь JBoss, но мне непонятно, какая версия RELEASE соответствует. Вы должны попробовать указать версии в разделе управления зависимостями и посмотреть, сохраняется ли проблема, например

<dependencyManagement>
    <dependencies>
        ...
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.4.Final</version>
        </dependency>
    </dependencies>
</dependencyManagement>

...

<dependencies>
    ...
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
    </dependency>
</dependencies>

Это имеет то преимущество, что вы исправляете версию зависимости для всего вашего проекта, включая транзитивные зависимости, вместо того, чтобы надеяться, что посредничество зависит от правильного.

Кстати, более простой способ получить то, что вам нужно от dependency:tree - это фильтр, в вашем случае с помощью

mvn dependency:tree -Dincludes=:*hibernate*::
  • 0
    Это показало только спящий режим, указанный в моем pom.xml. Но я обнаружил, насколько старше hibernate вмешался. Проверьте мое обновление в вопросе.
  • 1
    Теперь это другой вопрос, вы можете разместить его как таковой. В этом может быть слишком много несвязанных шумов, и теперь это специфично для JBoss.
1

Попробуйте запустить эту команду в том же каталоге, что и pom.xml:

mvn dependency:tree -Ddetail=true -Dincludes=org.hibernate:hibernate-core

Это даст вам дерево зависимостей не только выбранного гибернатного ядра, но и других зависимостей версий, которые присутствуют там, где они не выбраны, потому что какая-то другая зависимость приняла предположение.

Когда вы сомневаетесь, какую транзитивную зависимость выбрать, maven применяет следующие правила:

  • выигрывает зависимость, наиболее близкая к проекту pom.xml. например, если одна версия находится на двух уровнях в дереве, а другая на 1 уровень, побеждает один уровень.

  • если все зависимости находятся на одинаковом уровне расстояния от артефакта pom.xml, тот, который появляется сначала на выигрыше пом.

Решение этой проблемы состоит в том, чтобы увидеть с помощью команды выше всех, кто требует hibernate-core, решить, какую версию вы хотите, и добавить правильные исключения.

EDIT: Проблема в том, что JBoss 7 является контейнером EJB, который включает JPA, а JPA на сервере мешает JPA на WAR. Это связано с тем, что по умолчанию JBoss 7 работает в режиме "первый сервер", где он будет сначала получать библиотеки с сервера и только в том случае, если они не существуют из приложения.

Вы можете изменить это на "последний сервер", где банки в вашем приложении всегда имеют приоритет. Это можно сделать, установив java2ParentDelegation=false в файле jboss-app.xml или jboss-web.xml - см. Также этот ответ.

Вы также можете отключать серверные модули один за другим, но это больше подвержено ошибкам.

Для этого создайте файл в src/main/resources/META-INF именем jboss-deployment-structure.xml и отключите модули hibernate/JPA на сервере:

<?xml version="1.0" encoding="UTF-8"?>  
<jboss-deployment-structure>  
    <deployment>  
        <exclusions>  
            <module name="org.hibernate" /> 
            <module name="org.jboss.as.jpa" />
            <module name="org.jboss.as.jpa.hibernate" />
            ... 
       </exclusions>  
    </deployment>  
</jboss-deployment-structure>  
  • 0
    Это показало только спящий режим, указанный в моем pom.xml. Но я обнаружил, насколько старше hibernate вмешался. Проверьте мое обновление в вопросе.
  • 0
    Кажется, это проблема библиотек, один сервер мешает библиотекам одной WAR, смотрите обновление выше для двух способов выключить библиотеки на сервере и использовать только те, что на WAR
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню