现在的位置: 首页 > 综合 > 正文

学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

2013年02月20日 ⁄ 综合 ⁄ 共 1849字 ⁄ 字号 评论关闭

准备工作

在上篇博客中学习ORM框架—hibernate(一):初识hibernate通过简单的实例说明O和R的映射过程。本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移。

准备工作很重要,需要了解一些专业词汇,所谓专业词汇,意思大家都懂,只是在专业领域里起个专业的名称罢了。所以见到陌生东西时,应该尽可能的消除这种不必要的恐惧。

先了解这个专业词汇

何谓“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中。


持久化对象有三种状态



瞬时对象(Transient Objects):
1. 使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,将由垃圾回收机制回收。 
2. 没有被session管理
3. 在数据库中没有与之匹配的记录

持久化对象(Persist Objects):
1. 纳入持久化管理器Session统一管理
2. 持久实例是在事务中进行操作的,当事务提交时(在清理缓存时),通过执行SQL语句把内存中的状态同步到数据库中。
3. 在数据库中有与之匹配的记录

离线对象(Detached Objects):
1. Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
2. 在数据库中存在与之匹配的记录。


使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移

由transient状态到persist状态,完成insert操作
由detached状态到persist状态,完成update操作

public void testSave1(){
		Session session = null;
		User user = null;
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			// transient状态
			user = new User();
			user.setName("zhangsan");
			user.setPassword("123");
			
			// persist状态
			session.save(user);
			
			//Persistent状态的对象,如果对象的属性发生改变了
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			// 和数据库同步,体现在:当commit,开始清理缓存,使用快照比对的方式生成相应的sql语句,先insert,再update。
			user.setName("lisi");
			
			//可以显示的调用update方法,但此时为持久状态,调用update没有什么意义
			// session.update(user);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
		
		// detached状态
		user.setName("wangwu");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//将detached状态的对象重新纳入session管理
			//此时将变为persistent状态的对象
			session.update(user);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}

}

掌握了状态变化,当处于某个状态时就知道可以进行何种操作了。比如当处于Transient状态,我们只能进行save、update操作或者被回收。

Hibernate持久化是JPA规范的一种实现,还有其他实现方式,比如EJB的持久化,但大同小异,所以学好Hibernate的持久化,再学习其他的就更容易上手和理解了。

抱歉!评论已关闭.