做一个Hibernate简单实验时, 碰到了这个异常: Session was already closed. 现在有点时间, 这样见了异常就想看看: 是怎么"触犯"了hibernate导致这个异常的抛出?
例子中的代码结构是这样的:
Session session = sessionFactory.getCurrentSession();
Transaction t = session.beginTransaction();
// do something with the session
t.commit();
session.close();
异常是在session.close()一句抛出来的,Hibernate中SessionImpl类close方法里有这样的代码:
if ( isClosed() ) {
throw new SessionException( "Session was already closed" );
}
而自己写用session来干事的代码中没有把session关掉,那是什么时候session给关掉了呢? 第一个怀疑点放到了Transaction的提交上,即t.commit()这一句.
那t.commit()里具体做了什么? 这得先看org.hibernate.Transaction接口都有哪些实现类, 例子中又是用的哪个实现类的commit方法. 不难发现Transaction接口有如下实现类:
debug跟到t.commit()代码里,发现是调用的JDBCTransaction实现类的方法. 一番找寻后终于在finally里看到了closeIfRequired方法,很是可疑!名字都起的那么"此地无银三百两".
一番跟踪这后,在transactionContext.managedClose
方法里找到了"犯罪现场": close()! 原来已经调用此方法给关掉了!
疑问解决了.
在关session前先通过isOpen方法做个判断也就OK了.
但这个小问题引起的思考给我深入drill Hibernate打开一条小道: session.beginTransaction()做了什么?具体把session给关掉的transactionContext是干啥的?
它们又与getCurrentSession方法有什么关联?敬请关注后续报道.
分享到:
相关推荐
Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...
描述部分为空,但通常这样的教程会包括创建Hibernate配置、实体类、Session接口的使用,以及SQL语句的映射。 **Hibernate框架** Hibernate是一个开源的Java库,用于简化Java应用程序与关系型数据库之间的交互。它...
a different object with the same identifier value was already associated with the session 是一种常见的异常,通常是由于在 Hibernate 中同一个 session 里面有了两个相同标识但是是不同实体所致。解决方案有...
然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
Could not initialize proxy - the owning Session was closed 这是Hibernate懒加载机制中的常见异常,当尝试访问一个已被关闭的Session中的懒加载属性时触发。例如,如果Session在使用`setFetchMode(FetchMode....
本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存储。本篇文章将探讨“Hibernate学习一:简单应用1配置文件版”,主要涵盖如何...
《Hibernate Part 2:单表CRUD》 在Java企业级开发中,对象关系映射(Object-Relational Mapping,ORM)框架如Hibernate极大地简化了数据库操作,使得开发者可以更专注于业务逻辑,而不是繁琐的数据访问代码。本篇...
在Java的持久化框架Hibernate中,`Session`是与数据库交互的核心接口,它扮演着连接应用程序和数据库的角色。`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的...
在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...
### Hibernate的核心接口——Session详解 #### 一、Session简述 **1. Session概念** - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,...
- hibernate-core.jar:这是Hibernate的核心库,包含了许多核心接口和实现,如Session、SessionFactory、Query等。 - antlr-2.7.7.jar:提供了解析和生成SQL的能力,是Hibernate生成动态SQL的关键。 - dom4j-...
- Session:是Hibernate的主要工作接口,负责与数据库的交互,提供了数据的增删改查操作。 - EntityManager:JPA的一部分,提供了对实体对象的操作,包括管理实体状态、事务处理等。 - Configuration:配置...
本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...
【hibernate与Session详解】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
- Session:是Hibernate的核心接口,它负责在应用程序和数据库之间建立会话,管理对象的状态,并提供事务控制。 - Transaction:Hibernate提供了事务处理机制,可以集成JTA或JDBC事务。 - Criteria查询:提供了一...
- 配置Hibernate:设置数据库连接信息,创建SessionFactory。 - CRUD操作:通过Session接口进行增删改查操作,例如,保存一个新用户只需调用`session.save(user)`。 - 查询优化:利用缓存机制提高性能,或者通过...
"重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...