调用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
相关产品推荐
相关产品推荐

