我有两个项目,maven。
- A - 休息应用,使用 hibernate 5.2.16.FINAL,包括 B(不包括其 hibernate)
- B - 库,使用 hibernate 4.3.9
项目 A 创建自己的上下文,导入 DBConfig(B 的副本)替换 B 的 DBConfig,以使用正确的 hibernate5.HibernateTransactionManager、hibernate5.LocalSessionFactoryBean
项目 A 调用 B 中的服务 -> DAO -> 获取 session -> 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 上运行,要么失败。
有人有什么想法吗?
谢谢。
最佳答案
您可能需要使用相同的 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 中找不到,您可以使用在运行时。
关于java - Hibernate session.createSQLQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49877297/