hibernate三种状态

发表时间:2017-05-17 17:26:16 浏览量( 22 ) 留言数( 0 )

学习目标:

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();

		// 游离状态
	}

}