Hibernate持久化对象的三种状态

Hibernate中持久化对象的状态有:TransientPersistentDetached

Hibernate持久化对象的三种状态_第1张图片

持久化对象的生命周期是:



怎样理解持久化对象的三种状态呢?下面的代码会体现出来

[java] view plain copy print ?
  1. package com.bjpowernode.hibernate;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import junit.framework.TestCase;  
  6.   
  7. import org.hibernate.Session;  
  8. import org.hibernate.Transaction;  
  9.   
  10. public class SessionTest extends TestCase {  
  11.   
  12.     public void testSave1() {  
  13.         Session session = null;  
  14.         Transaction tx = null;  
  15.         try {  
  16.             session = HibernateUtils.getSession();  
  17.             tx = session.beginTransaction();  
  18.               
  19.             //此时对象刚new出来,对象为Transient状态,在数据库中不存在  
  20.             User user = new User();  
  21.             user.setName("张三");  
  22.             user.setPassword("123");  
  23.             user.setCreateTime(new Date());  
  24.             user.setExpireTime(new Date());  
  25.               
  26.             //Persistent状态  
  27.             //Persistent状态的对象,当对象的属性发生改变的时候  
  28.             //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步  
  29.             session.save(user);  
  30.               
  31.             user.setName("李四");  
  32.               
  33.             tx.commit();  
  34.               
  35.         }catch(Exception e) {  
  36.             e.printStackTrace();  
  37.             if (tx != null) {  
  38.                 tx.rollback();  
  39.             }  
  40.         }finally {  
  41.             HibernateUtils.closeSession(session);  
  42.         }  
  43.         //detached状态  
  44.     }  
  45.       
  46.     public void testSave2() {  
  47.         Session session = null;  
  48.         Transaction tx = null;  
  49.         try {  
  50.             session = HibernateUtils.getSession();  
  51.             tx = session.beginTransaction();  
  52.               
  53.             //Transient状态  
  54.             User user = new User();  
  55.             user.setName("张三");  
  56.             user.setPassword("123");  
  57.             user.setCreateTime(new Date());  
  58.             user.setExpireTime(new Date());  
  59.               
  60.             //Persistent状态  
  61.             //Persistent状态的对象,当对象的属性发生改变的时候  
  62.             //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步  
  63.             session.save(user);  
  64.               
  65.             user.setName("李四");  
  66.               
  67.             //可以显示的调用update方法,因为此时为持久状态,调用update没有什么意义  
  68.             session.update(user);  
  69.               
  70.             tx.commit();  
  71.               
  72.         }catch(Exception e) {  
  73.             e.printStackTrace();  
  74.             if (tx != null) {  
  75.                 tx.rollback();  
  76.             }  
  77.         }finally {  
  78.             HibernateUtils.closeSession(session);  
  79.         }  
  80.         //detached状态  
  81.     }     
  82.       
  83.     public void testSave3() {  
  84.         Session session = null;  
  85.         Transaction tx = null;  
  86.         User user = null;  
  87.         try {  
  88.             session = HibernateUtils.getSession();  
  89.             tx = session.beginTransaction();  
  90.               
  91.             //Transient状态  
  92.             user = new User();  
  93.             user.setName("张三");  
  94.             user.setPassword("123");  
  95.             user.setCreateTime(new Date());  
  96.             user.setExpireTime(new Date());  
  97.               
  98.             //Persistent状态  
  99.             //Persistent状态的对象,当对象的属性发生改变的时候  
  100.             //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步  
  101.             session.save(user);  
  102.               
  103.             user.setName("李四");  
  104.               
  105.             tx.commit();  
  106.               
  107.         }catch(Exception e) {  
  108.             e.printStackTrace();  
  109.             if (tx != null) {  
  110.                 tx.rollback();  
  111.             }  
  112.         }finally {  
  113.             HibernateUtils.closeSession(session);  
  114.         }  
  115.         //detached状态,数据库中存在,但不被session管理  
  116.         user.setName("王五");  
  117.         try {  
  118.             session = HibernateUtils.getSession();  
  119.             session.beginTransaction();  
  120.             //通过session.update()方法将detached状态的对象重新纳入session管理  
  121.             //此时将变为persistent状态的对象  
  122.             //persistent状态的对象,在清理缓存是会和数据库同步  
  123.             session.update(user);  
  124.             session.getTransaction().commit();  
  125.         }catch(Exception e) {  
  126.             e.printStackTrace();  
  127.             session.getTransaction().rollback();  
  128.         }finally {  
  129.             HibernateUtils.closeSession(session);  
  130.         }  
  131.     }  

Session对象的几种方法:

Get方法

特点:get加载上来的对象为持久对象执行get会马上发出查询语句get方法查询数据库中存在的数据;get方法查询数据库中不存在的数据,如果不存在返回nullget永远不支持lazy

Load方法

特点:与get方法相同的是加载出来的数据也是持久化的;不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载),什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类生成代理,它采用的是继承方式采用load查询不存在的数据hibernate会抛出ObjectNotFoundException异常load默认的是支持lazy

Update方法

特点:先加载再更新

Delete方法

特点:先加载再删除

你可能感兴趣的:(Hibernate持久化对象的三种状态)