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

Hibernate执行CRUD操作时遇LogicalConnectionManagedImpl已关闭错误求助

解决Hibernate报错:LogicalConnectionManagedImpl is closed

问题根源

报错出现在saveProduct方法的catch块执行transaction.rollback()时,原因是你使用了try-with-resources管理Session,当try块抛出异常后,Session会被自动关闭,此时事务关联的JDBC连接已经关闭,再执行回滚操作就会触发连接已关闭的错误。另外,当前报错只是回滚时的次生错误,原始异常被掩盖了,需要先排查try块中抛出异常的根本原因。

解决方案

1. 手动管理Session生命周期

替换try-with-resources为手动打开/关闭Session,确保回滚操作在Session关闭前执行:

修改ProductDao的两个方法:

package com.hibernate.dao;

import com.hibernate.model.Product;
import com.hibernate.util.*;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class ProductDao {

    // 保存产品
    public void saveProduct(Product product) {
        Transaction transaction = null;
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            transaction = session.beginTransaction();
            
            session.save(product);
            System.out.println("Product saved successfully");
            
            transaction.commit();
        } catch(Exception e) {
            if(transaction != null && transaction.getStatus().canRollback()) {
                transaction.rollback();
            }
            // 打印原始异常,排查根本问题
            e.printStackTrace();
        } finally {
            // 确保Session关闭
            if(session != null && session.isOpen()) {
                session.close();
            }
        }
    }

    // 根据ID查询产品
    public Product getProductById(long id) {
        Transaction transaction = null;
        Product product = null;
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            transaction = session.beginTransaction();
            
            product = session.get(Product.class, id);
            
            transaction.commit();
        } catch(Exception e) {
            if(transaction != null && transaction.getStatus().canRollback()) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            if(session != null && session.isOpen()) {
                session.close();
            }
        }
        return product;
    }
}

2. 排查原始异常

运行修改后的代码,控制台会打印try块中抛出的原始异常,常见原因包括:

  • Product类未添加@Entity、@Table注解
  • 主键字段未添加@Id和@GeneratedValue注解(例如@Id @GeneratedValue(strategy = GenerationType.IDENTITY))
  • 数据库连接配置错误(如用户名、密码错误,MySQL服务未启动)

3. 调整Hibernate配置(可选)

你的hbm2ddl.auto设置为create-drop,程序结束后会自动删除数据库,导致后续查询可能失败。如果需要保留数据库,改为:

settings.put(Environment.HBM2DDL_AUTO, "update");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:08:31