学习目标:
1、了解Hibernate三种状态
2、了解Hibernate不同状态的转换
学习过程:
一、Hibernate 三态
1、介绍三种状态
HIbernate对象有三种状态,理解这三种状态可以对Hibernate的运行机理有一个更深入的理解。三种状态分别是:瞬时状态、持久化状态和游离状态。
- 瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态,瞬时态对象具有如下特点: 没有与session关联,也没有在数据库中没有对应的记录,此对象就是瞬时态。该实例从未与任何持久化上下文关联过。它没有持久化标识(相当于主键值)。
- 持久状态:将程序数据在瞬时状态和持久状态之间转换的机制,保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态
- 游离状态 Transient:游离状态对象具有如下特点:和session实例没有关联;在数据库中有与之关联的记录。
2、三种状态之间的转换
状态不是一直不变的,在运行过程中可以不断从一种状态到另外一种状态。 如下图:
持久态 Persistent,处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
游离状态当与某持久对象关联的session被关闭后,该持久对象转变为游离状态对象。当游离状态对象被重新关联到session上时,并再次转变成持久对象。脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。脱管对象具有如下特点:本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;比瞬时对象多了一个数据库记录标识值。
三、代码测试
/**
* 三态
*
* @author Administrator
*
*/
public class RunState {
public static void main(String[] args) {
// 临时状态 >> 只在 内存中
Employee employee = new Employee();
employee.setEmployeeName("刘邦");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
System.out.println(employee.getEmpId());
// 持久化 之后 与数据库对应
session.save(employee);// insert into
employee.setEmployeeName("凤姐");
System.out.println(employee.getEmpId() + ":"
+ employee.getEmployeeName());
// 持久化 之前
session.getTransaction().commit();
// 游离状态
System.out.println("游离状态:" + employee.getEmpId() + ":"
+ employee.getEmployeeName());
// 游离状态 id有值
employee.setEmployeeName("另外一个");
System.out.println(employee.getEmpId());
// session.update(employee);
Session session2 = HibernateUtil.getSessionFactory()
.getCurrentSession();
session2.beginTransaction();
session2.update(employee);// >>持久化状态
session2.getTransaction().commit();
// 游离状态
}
}
本文深入讲解Hibernate中的瞬时状态、持久化状态和游离状态,分析三态的特性和转换机制,通过代码示例演示如何在程序中实现状态转换。
1万+

被折叠的 条评论
为什么被折叠?



