Hibernate session.createSQLQuery

时间:2018-04-17 11:48:52

标签: java spring hibernate maven spring-mvc

我有两个项目,maven。

  • A - 休息应用,使用hibernate 5.2.16.FINAL,包括B(不包括其休眠)
  • B - 库,使用hibernate 4.3.9

项目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上运行或失败。

有人提出任何想法吗?

谢谢。

1 个答案:

答案 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中找到它。