You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven多模块项目Hibernate版本冲突致createSQLQuery方法报错

解决Hibernate版本冲突引发的NoSuchMethodError问题

这个问题我之前碰到过类似的,核心就是编译时依赖的Hibernate版本和运行时加载的版本不匹配导致的方法签名冲突。结合你的场景——A用Hibernate5,B用Hibernate4,虽然你排除了B的Hibernate依赖,但B的代码编译时是基于Hibernate4的API写的,运行时却用了Hibernate5的类,自然会出问题。咱们一步步来解决:

一、先彻底排查依赖,确保运行时只有Hibernate5的类

首先得确认你的项目A最终打包后的依赖里,有没有偷偷混入Hibernate4的jar包——有时候间接依赖会搞事情。

  • 跑个Maven命令看依赖树:
    mvn dependency:tree -Dincludes=org.hibernate
    
  • 如果发现有Hibernate4的依赖(不管是来自B还是其他库),直接在A的pom.xml里把B的依赖排除所有Hibernate相关的包,别留死角:
    <dependency>
        <groupId>你的B库groupId</groupId>
        <artifactId>B</artifactId>
        <version>你的B库版本</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
            </exclusion>
            <!-- 其他Hibernate4相关的包也一起排除 -->
        </exclusions>
    </dependency>
    

二、如果能改B库的代码,直接适配Hibernate5 API

要是你有权限修改B的代码,这是最彻底的解决办法:

  • Hibernate5里createSQLQuery已经被标记为过时了,官方推荐用createNativeQuery替代,把B里DAO的代码改一改:
    // 原来Hibernate4的写法
    SQLQuery query = session.createSQLQuery("SELECT * FROM your_table");
    // 改成Hibernate5兼容的写法
    NativeQuery query = session.createNativeQuery("SELECT * FROM your_table");
    
  • 要是B的代码里非要用SQLQuery的特定方法,可以用unwrap转一下(不过不推荐,毕竟SQLQuery已经过时了):
    NativeQuery nativeQuery = session.createNativeQuery("SELECT * FROM your_table");
    SQLQuery sqlQuery = nativeQuery.unwrap(SQLQuery.class);
    

三、确保B的DAO用的是A提供的Hibernate5 SessionFactory

如果没法改B的代码,那得保证B的DAO拿到的Session是A的Hibernate5 SessionFactory生成的:

  • 检查你的上下文配置:确认A完全替换了B的DBConfig,所有DAO注入的SessionFactory都是A配置的LocalSessionFactoryBean(Hibernate5版本的),别让B自己的SessionFactory偷偷生效。
  • 再检查事务:调用B的服务时,要确保处于A的事务上下文里——你的HibernateTransactionManager得配置正确,@Transactional注解要生效,这样SessionFactory.getCurrentSession()拿到的才是Hibernate5的Session,而不是旧版本的。

四、极端情况:处理类加载器隔离

要是上面的方法都没用,那可能是类加载器的问题(比如应用服务器自己加载了旧的Hibernate类):

  • 如果你是Spring Boot应用,可以在配置里加spring.devtools.restart.additional-exclude排除旧的Hibernate依赖,或者把冲突的依赖scope设为provided。
  • 传统WAR应用的话,直接去WEB-INF/lib目录看看,把所有Hibernate4的jar包删掉,只留Hibernate5的。

内容的提问来源于stack exchange,提问作者aRagornol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:18:21