跟踪对象持久化状态,掌握对象持久化

来源:互联网 发布:汉唐香莎温泉会所 js 编辑:程序博客网 时间:2024/05/20 13:13

准备工作

在上篇博客中学习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操作

[java] view plaincopy
  1. <span style="font-size:18px;">public void testSave1(){  
  2.         Session session = null;  
  3.         User user = null;  
  4.           
  5.         try {  
  6.             session = HibernateUtils.getSession();  
  7.             session.beginTransaction();  
  8.               
  9.             // transient状态  
  10.             user = new User();  
  11.             user.setName("zhangsan");  
  12.             user.setPassword("123");  
  13.               
  14.             // persist状态  
  15.             session.save(user);  
  16.               
  17.             //Persistent状态的对象,如果对象的属性发生改变了  
  18.             //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步  
  19.             // 和数据库同步,体现在:当commit,开始清理缓存,使用快照比对的方式生成相应的sql语句,先insert,再update。  
  20.             user.setName("lisi");  
  21.               
  22.             //可以显示的调用update方法,但此时为持久状态,调用update没有什么意义  
  23.             // session.update(user);  
  24.               
  25.             session.getTransaction().commit();  
  26.         } catch (Exception e) {  
  27.             e.printStackTrace();  
  28.             session.getTransaction().rollback();  
  29.         } finally {  
  30.             HibernateUtils.closeSession(session);  
  31.         }  
  32.           
  33.         // detached状态  
  34.         user.setName("wangwu");  
  35.         try {  
  36.             session = HibernateUtils.getSession();  
  37.             session.beginTransaction();  
  38.               
  39.             //将detached状态的对象重新纳入session管理  
  40.             //此时将变为persistent状态的对象  
  41.             session.update(user);  
  42.               
  43.             session.getTransaction().commit();  
  44.         } catch (Exception e) {  
  45.             e.printStackTrace();  
  46.             session.getTransaction().rollback();  
  47.         } finally {  
  48.             HibernateUtils.closeSession(session);  
  49.         }  
  50.   
  51. }  
  52. </span>  


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

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