`

理解持久化类状态、生命周期和Session接口方法工作原理

阅读更多
持久化实例有三种状态:
1.临时状态(transient):刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象称为临时对象。
2.持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。
3.游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。

持久化实例的生命周期:
new出一个对象表示生命周期开始。
只要有变量引用该实例或者处于Session的缓存当中,就一直处于生命周期中。
直到没有任何变量引用该实例并且不在Session的缓存当中,生命周期结束。

在默认情况下,Session会在下面的时间点清理缓存。
1 当应用程序调用net.sf.hibernate.Transacation的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
2 当应用程序调用Session的find()或者iterate()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久

化对象的最新状态。
3 当应用程序显示调用Session的flush()方法的时候。
Session进行清理缓存的例外情况是:如果对象使用native生成器来生成OID,那么当调用Session的save()保存该对象时,会立即执行向数据库插

入该实体的insert语句。
注意Session的commit()和flush()方法的区别。flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先

调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。

Session在清理缓存时,按照以下顺序执行SQL语句:
1.按照应用程序调用session.save()方法的衔后顺序,执行所有对实进行插入的insert语句。
2.执行所有对实体进行更新的update语句。
3.执行所有对集合进行删除的delete语句。
4.执行所有对集合元素进行删除、更新或者插入的SQL语句。
5.执行所有对集合进行插入的insert语句。
6.按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。


下面用代码来理解以上概述,同时理解Session接口的save()、update()、saveOrUpdate()、delete()、load()和get()方法的工作原理。
Session的save()方法
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Customer customer = new Customer(); //customer对象处于临时状态
customer.setName("David");
session.save(customer); //customer对象处于持久化状态
tx.commit();
customer.setName("Bruce"); //无效
session.close(); //customer对象处于游离状态
} catch(Exception e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
}
}
/**Output:
Hibernate: insert into CUSTOMERS (NAME) values (?)
*/
session.save()的行为:
1.将持久化实例加入到缓存中,使它变为持久化对象。
2.为持久化对象分配唯一的OID。
3.组装insert语句,但不立即执行,Session清理缓存时才执行。

customer.setName("Bruce");并没有执行,因为这条语句之后没有清理缓存,而是直接关闭Session。
如果想要执行该update操作,以下两种方式都可以
session.save(customer);
customer.setName("Bruce");
tx.commit(); //因为commit()操作会清理缓存
或者
session.save(customer);
tx.commit();
customer.setName("Bruce");
session.flush();
/**Output:
Hibernate: insert into CUSTOMERS (NAME) values (?)
Hibernate: update CUSTOMERS set NAME=? where ID=?
*/

如果在修改了对象属性后再保存一次,不会理会那个语句,也不会重复执行SQL
Customer customer = new Customer();
customer.setName("David");
session.save(customer);
customer.setName("Phil");
session.save(customer); //多余的语句
tx.commit();
/**Output:
Hibernate: insert into CUSTOMERS (NAME) values (?)
Hibernate: update CUSTOMERS set NAME=? where ID=?
*/

如果多次修改name属性,只会执行一条Update语句。
Customer customer = new Customer();
customer.setName("David");
session.save(customer);
customer.setName("Phil");
customer.setName("AA");
customer.setName("BB");
tx.commit();
/**Output:
Hibernate: insert into CUSTOMERS (NAME) values (?)
Hibernate: update CUSTOMERS set NAME=? where ID=?
*/
因为对象进入缓存的时候(这里是save()的时候),会为持久化对象产生一份快照,最后保存的时候会和快照对比哪些属性值改变了。

Session的update()方法
public static void main(String[] args) {
try {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer(); //customer对象处于临时状态
customer.setName("David");
session.save(customer); //customer对象处于持久化状态
session.update(customer); //不执行update语句,因为属性没有改变
tx.commit();
session.close(); //customer对象处于游离状态

Session session2 = HibernateUtil.getSession();
tx = session2.beginTransaction();
customer.setName("Phil"); //customer对象处于游离状态
session2.update(customer); //customer对象处于持久化状态
customer.setName("Bruce");
tx.commit();
session2.close(); //customer对象处于游离状态
} catch(Exception e) {
e.printStackTrace();
}
}
/**Output:
Hibernate: insert into CUSTOMERS (NAME) values (?)
Hibernate: update CUSTOMERS set NAME=? where ID=?
*/

session.update()的行为:
1.将游离对象重新加入到Session的缓存中,使它变为持久化类。
2.update()方法不会组装update语句,当清理缓存时才组装update语句。

因此上面的代码只执行了了一条update语句,即使执行多次update()方法,也只会执行一次update语句
//customer是游离对象
Session session2 = HibernateUtil.getSession();
tx = session2.beginTransaction();
customer.setName("Phil");
session2.update(customer);
customer.setName("Bruce");
session2.update(customer);
session2.update(customer);
tx.commit();
session2.close();
/**Output:
Hibernate: update CUSTOMERS set NAME=? where ID=?
*/

即使没有修改任何对象属性,update()操作都会执行一条update语句。
//customer是游离对象
Session session2 = HibernateUtil.getSession();
tx = session2.beginTransaction();
session2.update(customer);
tx.commit();
session2.close();
/**Output:
Hibernate: update CUSTOMERS set NAME=? where ID=?
*/
因为session2没有customer的快照,所以无法判断属性是否有改变。

Session的saveOrUpdate()方法
同时包含save()和update()方法的功能。如果传入的参数是临时对象,就执行save()方法;如果传入的参数是游离对象,就执行update()方法;

如果传入的参数是持久化对象,那就直接返回;

Session的load()和get()方法
这两个方法都是从数据库加载一个持久化对象。
区别在于:
1.加载的OID在数据库中没有对应的记录时,load()方法会抛org.hibernate.ObjectNotFoundException异常;get()方法返回null;
2.load()方法是延迟加载,get()方法是立即加载。

Session的delete()方法
从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划一个delete语句;如果传入的参数是游离对象,先使游离

对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句;如果传入的参数是临时对象,直接返回,不抛错。
0
0
分享到:
评论

相关推荐

    Hibernate持久化对象的生命周期

    Hibernate的核心概念之一就是持久化对象的生命周期,这涉及到对象在数据库中的状态及其与Session的关系。 首先,我们来看一下Hibernate中持久化对象的三种基本状态: 1. **瞬时对象(Transient Objects)**: - ...

    javaee-Session持久化小结

    总结来说,"javaee-Session持久化小结"这篇文章应该全面介绍了JavaEE中Session的基本概念、操作方法、生命周期管理以及持久化策略,同时也可能涉及了相关的源码分析和实用工具。对于理解和优化Web应用的Session管理...

    Session的工作原理与概念详解

    ##### 2.2 Session的生命周期 - **创建**:当客户端首次访问网站时,服务器创建Session。 - **维护**:服务器在内存中或持久化存储中维护Session数据。 - **失效**:Session会在一段时间后自动失效,这段时间由...

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    深入理解持久化对象

    持久化对象是Hibernate框架的核心概念之一,通过合理的状态管理和生命周期控制,可以极大地提高应用程序的开发效率和维护性。理解和掌握持久化对象的状态转换及修改方法,对于高效使用Hibernate框架至关重要。

    hibernate持久化对象生命周期[参照].pdf

    本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象(Transient Objects) 瞬时对象是指通过`new`操作符创建但尚未与数据库记录关联的Java对象...

    域对象在持久化层的状态

    每种状态都代表了对象与持久化框架(如Hibernate)之间的不同关系,进而影响着对象的生命周期管理和数据库交互策略。 1. **临时状态**:对象刚被创建但尚未与任何持久化会话(Session)关联时所处的状态。这种状态...

    Hibernate对象持久化状态

    本篇文章将详细阐述 Hibernate 中对象的三种状态——临时状态、持久化状态和游离状态,以及 Session 缓存的工作原理。 1. Session 缓存及作用 Session 是 Hibernate 提供的一个接口,它充当了应用程序与数据库之间...

    asp.net c# 在类中使用session的方法

    5. **生命周期管理**:理解Session的生命周期,合理设置Session的超时时间,避免不必要的资源浪费。 ### 四、总结 在ASP.NET C#应用中,熟练掌握在类中使用Session的方法,能够显著提升应用的功能性和用户体验。...

    c#.net配置Session的生命周期.rar(视频)

    本教程将深入探讨如何在C#.NET环境中配置Session的生命周期,以及它对应用程序性能和用户体验的影响。 首先,Session的基本概念:Session是服务器端存储用户特定信息的一种方式。当用户访问网站时,服务器为每个...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    总的来说,Hibernate的Session接口提供了一套完整的对象持久化和数据库操作机制,使得开发者能够以面向对象的方式处理数据,极大地提高了开发效率和代码的可读性。通过深入理解和熟练运用Session,可以轻松地在Java...

    hibernate的核心接口--Session

    ### Hibernate的核心接口——Session详解 #### 一、Session简述 **1. Session概念** - **定义**: Session 是 Hibernate ...理解 Session 的工作原理及其与对象生命周期之间的关系对于有效使用 Hibernate 至关重要。

    Hibernate 操纵持久化对象

    Hibernate提供了四种对象状态:瞬时态、持久态、脱管态和临时态,理解这些状态对于有效操纵持久化对象至关重要。 **三、配置Hibernate** 在开始操纵持久化对象之前,需要先配置Hibernate。这包括编写Hibernate配置...

    SSHnote session函数的对象状态转换

    当对象通过Session的`save()`、`saveOrUpdate()`或`persist()`方法被持久化后,它进入持久化状态。此时,对象与数据库中的特定记录关联,它的生命周期受到Session的管理。如果对象的属性发生变化,Hibernate会在...

    xfire开发的带session生命周期的webservice应用工程实例

    1. **服务接口和服务实现**:定义了Web服务的接口(通常为JAX-WS的`@WebService`注解的接口)和其实现类,可能包含了处理Session的方法。 2. **会话管理类**:如前所述,可能存在一个类用于管理Session生命周期。 3....

    seesion注意问题

    4. Session的生命周期: 当用户打开一个网页,服务器创建Session并分配Session ID,这个ID通常通过Cookie存储在客户端。若用户关闭浏览器,Session ID丢失,Session被视为失效。但有些情况下,即使浏览器未关闭,...

    java持久化工具类:JavaBean与XML

    在Java开发中,持久化是将数据保存到可持久存储设备(如数据库)中的过程,以便在程序关闭后还能保留这些数据。JavaBean和XML在Java持久化中扮演着重要角色。...这对于理解Java持久化和ORM框架的工作原理至关重要。

    hibernate的生命周期

    在Hibernate中,每个持久化对象都有一个生命周期,理解这些生命周期状态对于优化性能和正确管理数据库记录至关重要。 **一、持久化对象的状态** 1. **瞬时态(Transient)**:对象刚刚被创建,尚未与Session关联,...

    Hibernate 面试题

    1. **持久化对象的生命周期**:在Hibernate中,对象经历了临时态、持久态和游离态三个状态。临时态的对象没有与Session关联,数据未保存到数据库;持久态对象已与Session绑定,其状态会随Session的提交而保存到...

    Hibernate的Session的javadoc

    了解并熟练掌握这些概念和方法,能帮助开发者更好地理解和利用Hibernate的透明持久化能力,有效地管理对象的状态和事务,从而提高应用的性能和数据一致性。对于初学者来说,阅读Hibernate的javadoc是非常有益的,...

Global site tag (gtag.js) - Google Analytics