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

调用transaction.rollback()时出现LogicalConnectionManagedImpl已关闭异常的解决方法

解决方案

首先,核心问题是Hibernate无法识别User实体映射,后续的事务回滚异常是查询失败后Session被提前关闭导致的,按以下步骤逐一解决:

1. 确保User实体被正确映射

  • 检查User类是否添加了@Entity注解,且注解包路径正确(根据Hibernate版本选择javax.persistence.Entity或jakarta.persistence.Entity)。
  • 若使用XML映射文件,确认hibernate.cfg.xml中已引入该映射:
    <!-- 注解方式的实体扫描 -->
    <mapping class="com.your.package.User"/>
    <!-- XML映射文件方式 -->
    <mapping resource="com/your/package/User.hbm.xml"/>
    
  • 开启Hibernate自动扫描实体:在hibernate.cfg.xml中添加配置:
    <property name="hibernate.archive.autodetection">class,hbm</property>
    

2. 修正HQL查询语句

HQL依赖实体类的完整类名(大小写敏感),若存在类名冲突,直接使用全限定类名:

Query<User> query = session.createQuery(
    "from com.your.package.User where login=:login and password=:password", 
    User.class
);

注:即使使用带泛型的createQuery,实体未正确映射仍会抛出QuerySyntaxException。

3. 修复事务回滚的异常逻辑

原代码中try-with-resources会自动关闭Session,查询抛出异常后Session可能已关闭,导致transaction.rollback()触发连接关闭异常。调整逻辑确保事务操作在Session存活期内执行:

public User checkLogin(String login, String password) {
    User user = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession()) {
        Transaction transaction = session.beginTransaction();
        try {
            Query<User> query = session.createQuery(
                "from com.your.package.User where login=:login and password=:password", 
                User.class
            );
            query.setParameter("login", login);
            query.setParameter("password", password);
            user = query.getSingleResult();
            transaction.commit();
        } catch (Exception ex) {
            // 回滚前检查事务是否处于活跃状态
            if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
            ex.printStackTrace();
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return user;
}

4. 额外检查项

  • 确认Hibernate依赖版本与实体注解兼容(如Jakarta EE项目需搭配Hibernate 6+版本)。
  • 检查User类的@Table注解(若存在)是否正确指定数据库表名,但这不是本次异常的直接原因。

内容的提问来源于stack exchange,提问作者Renaud is Not Bill Gates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:05:17