我有两个项目,maven。
项目A创建自己的上下文,导入DBConfig(Bs的副本)替换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而没有任何进一步的代码更改时,它可以工作,或者如果我将 DAO 从B移动到A(也在上下文中使用适当的配置 - 包括移动的DAO并排除一个来自B - 因为bean名称重复)它也有效吗?
怎么可能?我真的不理解或遗漏某些东西。如果没有对项目B进行任何代码更改,只需配置maven hibernate依赖项(如上所述在A中排除)代码在DAO.createSQLQuery上运行或失败。
有人提出任何想法吗?
谢谢。
答案 0 :(得分:1)
您可能需要使用相同的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,它就会引用由{(createSQLQuery
)定义的SQLQuery createSQLQuery(String)
,并且无法在运行时使用5.2中找到它。