我正在修补应该修复的错误:isMember on @ElementCollection throws QuerySyntaxException: unexpected end of subtree
我在Google上搜索了这个问题并找到了票据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
。所以我试图在我的pom中添加对hibernate-core的依赖而没有结果:
<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
更新:我发现JBoss服务器本身拖了hibernate 4.0.1。所以我尝试使用此Updating the Hibernate 4.x jars to a different Hibernate 4.x version
来升级Hibernate然而,在这样做之后我得到了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
答案 0 :(得分:1)
如果您以某种方式引入两个org.hibernate:hibernate-core
工件,依赖项调解应该启动并选择一个。并且没有任何迹象表明您从dependency:tree
输出中提取了两个具有不同坐标的Hibernate工件。所以这听起来更像是一个错误配置的项目,而不是JAR地狱本身,即你在拉动冲突的图书馆。但是,如果您想完全确定,请使用
mvn com.ning.maven.plugins:maven-duplicate-finder-plugin:1.0.4:check
这是一个很好的JAR hell plugin。
您的POM文件和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*::
答案 1 :(得分:1)
尝试在与pom.xml相同的目录中运行此命令:
mvn dependency:tree -Ddetail=true -Dincludes=org.hibernate:hibernate-core
这将为您提供不仅选择了hibernate-core的依赖树,而且还提供了其他版本的依赖关系树,其中没有选择,因为其他依赖关系占优势。
当怀疑选择哪种传递依赖时,maven应用以下规则:
最接近pom.xml项目的依赖项获胜。例如,如果一个版本在树中距离两个级别,而另一个版本距离另一个级别,那么一个级别的距离将获胜。
如果所有依赖项与pom.xml工件的距离都相同,则首先在pom上显示的依赖项将获胜。
这个问题的解决方案是在每个人都需要hibernate-core的命令上查看,确定你想要的版本并添加适当的排除。
编辑:问题是JBoss 7是一个包含JPA的EJB容器,服务器上的JPA干扰了WAR上的JPA。这是因为默认情况下JBoss 7在“服务器优先”模式下工作,它首先从服务器获取库,并且只有在应用程序不存在时才会这样。
您可以将其更改为“服务器最后”,其中应用程序中的jar始终优先。这可以通过在文件java2ParentDelegation=false
或jboss-app.xml
中设置jboss-web.xml
来完成 - 另请参阅此answer。
您也可以逐个关闭服务器模块,但这更容易出错。
为此,在名为src/main/resources/META-INF
的{{1}}中创建一个文件,然后关闭服务器上的hibernate / JPA模块:
jboss-deployment-structure.xml