我有两个项目,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.NoSuchMethodErrorcreateSQLQuery在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中找不到,您可以在运行时使用它。

07-28 08:32