【问题标题】:Hibernate session.createSQLQuery休眠会话.createSQLQuery
【发布时间】:2018-09-27 08:57:03
【问题描述】:

我有两个项目,maven。

  • A - 休息应用,使用休眠 5.2.16.FINAL,包括 B(不包括其休眠)
  • B - 库,使用休眠 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 中将 hibernate 更改为 5.2.16 而没有任何进一步的代码更改时,它可以工作,或者如果我将 DAO 从 B 移动到 A(也在上下文中进行了适当的配置 - 包括移动的 DAO 并排除了一个来自 B - 因为 bean 名称重复)它也有效?!

这怎么可能?我真的不明白或错过了什么。在项目 B 上没有任何代码更改,只需配置 maven hibernate 依赖项(如上所述,在 A 中排除),代码在 DAO.createSQLQuery 上运行或失败。

有人有什么想法吗?

谢谢。

【问题讨论】:

    标签: java spring hibernate maven spring-mvc


    【解决方案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) 使用的返回类型。但是,一旦 B 使用 4.3 编译,它会引用 4.3 (SQLQuery createSQLQuery(String)) 定义的 createSQLQuery,并且在运行时使用的 5.2 中找不到。

    【讨论】:

    • 认为它可以有一些与编译有关的东西
    • 比较字节码实际上表明这非常好。再次感谢您
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2013-09-14
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多