转自:http://www.blogjava.net/gm_jing/archive/2006/12/09/58881.html
Session.get/load的区别:
1.如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObejctNotFoundException。
2.Load方法可返回实体的代理类类型,而get方法永远直接返回实体类。
3.Load方法可以充分利用内部缓存和二级缓存中现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
Session.find/iterate的区别:
find方法将执行Select SQL从数据库中获得所有符合条件的记录并构造相应的实体对象,实体对象构建完毕之后,就将其纳入缓存。它对缓存只写不读,因此无法利用缓存。
iterate
方法首先执行一条Select
SQL以获得所有符合查询条件的数据id,随即,iterate方法首先在本地缓存中根据id查找对应的实体对象是否存在,如果缓存中已经存在对应的数
据,则直接以此数据对象作为查询结果,如果没有找到,再执行相应的Select语句获得对应的库表记录(iterate方法如果执行了数据库读取操作并构
建了完整的数据对象,也会将其查询结果纳入缓存)。
[实际的情况是,如果使用
了iterate方法返回Iterator类型的查询结果,那么你一旦关闭session,Iterator中的数据立即就会消失.而通过find得到的
List则不会如此,我想大部分人的使用习惯都是操作完成后立即关闭session,很多公司也强制要求这样做.
Iterator的另一个麻烦事是fail-fast,在多线程环境下,很容易产生.使用线程安全的List子类,则不会有这个问题]
Query Cache产生作用的情况:
1.完全相同的Select SQL重复执行。
2.在两次查询之间,此Select SQL对应的库表没有发生过改变。
Session.save方法的执行步骤:
1.在Session内部缓存中寻找待保存对象。内部缓存命中,则认为此数据已经保存(执行过insert操作),实体对象已经处于Persistent状态,直接返回。
2.如果实体类实现了lifecycle接口,则调用待保存对象的onSave方法。
3.如果实体类实现了validatable接口,则调用其validate()方法。
4.调用对应拦截器的Interceptor.onSave方法(如果有的话)。
5.构造Insert SQL,并加以执行。
6.记录插入成功,user.id属性被设定为insert操作返回的新记录id值。
7.将user对象放入内部缓存。
8.最后,如果存在级联关系,对级联关系进行递归处理。
Session.update方法的执行步骤:
1.根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前实体对象已经处于Persistent状态,返回。
2.初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存。注意这里Session.update方法本身并没有发送Update SQL完成数据更新操作,Update SQL将在之后的Session.flush方法中执行,
根据id更新所有的字段,如update user set name=?, password=? where id=?。
Session.saveOrUpdate方法的执行步骤:
1.首先在Session内部缓存中进行查找,如果发现则直接返回。
2.执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
3.根据unsaved-value判断对象是否处于未保存状态。
4.如果对象未保存(Transient状态),则调用save方法保存对象。
5.如果对象为已保存(Detached状态),调用update方法将对象与Session重新关联。
Session.delete(E)
E 由持久状态/游离状态 -->>自由状态
Session.flush()
调用flush
1.直接调用Session.flush();
2.tx.commit();
//flush before commiting the transaction and closing the session
//Flushing is the process of synchronising the underlying persistent store with persistable state held in memory.
E1=Session.merge(E)
if E is transient instance,则insert数据库,E状态不变化,E1是一个持久化对象;
if E is detached instance,则重新load,变成persistent instance;
if E is persistent instance,则从缓存中选择;
// Copy the state of the given object onto the persistent object with the same identifier.
//
If there is no persistent instance currently associated
with the session, it will be loaded. Return the
persistent instance.
// If the given instance is unsaved, save a copy of and return it as a newly persistent instance.
The given instance does not become associated with the session.
// This operation cascades to associated instances if the association is mapped with cascade="merge".
Session.persist(E)
if E is transient instance,则类似save方法;
if E is detached instance,则抛出PersistentObjectException: detached entity passed to persist;
if E is persistent instance,则类似save方法;
分享到:
相关推荐
Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...
然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...
本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...
本文将深入探讨Hibernate Session的详细方法及其应用场景,旨在为开发者提供一份全面、实用的指南。 #### 一、Session 的生命周期与事务管理 Hibernate Session的生命周期通常包括打开、使用和关闭三个阶段。在...
在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...
在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...
本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...
本篇文章将探讨如何对Hibernate的`Session`进行简单的包装,以提升代码的可维护性和灵活性。`Session`是Hibernate的核心组件,它负责对象的持久化操作,如保存、更新、查询等。 `Session`接口提供了多种方法来与...
`Session`的常用方法包括:`save()`, `update()`, `delete()`, `get()`, `load()`, `query()`等。 1. `save()` 和 `update()`: `save()`用于将新对象持久化到数据库,如果对象已经存在,可以使用`update()`来更新其...
重写Session主要是继承Hibernate的DefaultSessionImpl或者BaseSessionImpl,并覆盖其中的方法,比如在save()、update()、delete()之前或之后添加自定义代码。此外,也可以扩展query()方法来实现更复杂的查询逻辑。 ...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
本篇文章将深入探讨如何实现自己的Hibernate框架,特别是Session方法的实现,这对于理解ORM的工作原理及优化数据库访问逻辑具有重要意义。 首先,我们需要了解Hibernate的核心概念——Session。在Hibernate中,...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
总的来说,`Session`在Hibernate中扮演着至关重要的角色,`delete()`方法是它实现对象持久化操作的一部分,正确理解和使用这些方法对于高效地操作数据库至关重要。理解`Session`的工作原理,以及与`SessionFactory`...
本文将深入研究Hibernate中的`Session`和`Transaction`,这两个概念是理解Hibernate工作原理的关键。 首先,让我们了解`Session`。在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的...
在Java的持久层框架Hibernate中,SessionFactory是核心组件之一,它是线程安全的,负责创建Session对象,每个Session对应于数据库的一次会话。配置SessionFactory主要是通过Hibernate的配置文件(通常为hibernate....
hibernate中session对象的状态详解
本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...
通过这些步骤,我们可以看到Hibernate如何简化了数据库操作,将底层SQL语句抽象为面向对象的方法调用,使得开发者可以更加专注于业务逻辑,而不是数据存取的细节。这也是JavaEE技术栈中Hibernate深受开发者喜爱的...
`HibernateSessionFactory` 类是Hibernate应用中常见的一个工具类,用于管理和提供与当前线程相关的Session实例。让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化...