我有两个项目,maven。
A-rest应用,使用休眠模式5.2.16.FINAL,包括B(不包括其休眠模式)
B-使用休眠4.3.9的库
项目A创建自己的上下文,该上下文导入DBConfig(B的副本)来代替B的上下文,以使用适当的hibernate5.HibernateTransactionManager,hibernate5.LocalSessionFactoryBean
项目A在B-> DAO->获取会话-> createSQLQuery中调用服务。
这失败了
java.lang.NoSuchMethodError: org.hibernate.Session.createSQLQuery(Ljava/lang/String;)Lorg/hibernate/SQLQuery;
当我在B中将休眠更改为5.2.16而不进行任何进一步的代码更改时,它可以工作,或者如果我将B中的DAO移到了A(也由于在上下文中具有正确的配置-包括已移动的DAO且从B中排除了DAO-由于bean名称重复)也可以吗?!
那怎么可能呢?我真的不了解或错过任何东西。仅通过配置Maven休眠依赖项(如上所述,它就排除在A中)而无需在项目B上进行任何代码更改,代码就可以在DAO.createSQLQuery上运行或失败。
有人知道吗?
谢谢。
最佳答案
您可能需要使用相同的Hibernate版本编译两个项目。
为什么在您的情况下出现java.lang.NoSuchMethodError
:createSQLQuery
在4.3(http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/SharedSessionContract.html)和5.2(http://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/QueryProducer.html)中的定义略有不同。注意返回类型是不同的。
在编译时,如果使用任何一个版本,方法调用都会正确解析。这是因为5.2(NativeQuery
)使用的返回类型扩展了4.3(SQLQuery
)使用的返回类型。但是,一旦用4.3编译了B,它将引用由4.3(createSQLQuery
)定义的SQLQuery createSQLQuery(String)
,并且在5.2中找不到,您可以在运行时使用它。