温故知新:hibernate_02对象状态

hibernate对象含有三种状态,瞬时,持久和离线。简而言之就是,瞬时对象和hibernate session没关系,持久对象就是和hibernate session有关系,并且当前事物还没有提交,持久对象的所有变化都会反映到数据库中,最后,离线对象就是和hiberante session有过关系,但是事物已经提交了,离线对象已经脱离了hibernate session的管理,自身的状态不会反映到数据库中。下面通过几个测试案例感受一下。
  1 package demo;
  2 
  3 import org.hibernate.Session;
  4 import org.junit.Test;
  5 
  6 import domain.Student;
  7 import util.HibernateUtil;
  8 
  9 public class App 
 10 {
 11     
 12     //省略相关工具类和实体类 
 13     @Test
 14     public void testTransien() {
 15         Session session = null;
 16         try {
 17             session = HibernateUtil.openSession();
 18             session.beginTransaction();
 19             
 20             //对hibernate而言,stu1对象和session没有任何关联,所以该对象不会反映到数据库中
 21             Student stu1 = new Student();
 22             stu1.setName("小明");
 23             stu1.setGrade("一");
 24             
 25             session.getTransaction().commit();
 26             
 27         } catch (Exception e) {
 28             if (session != null) {
 29                 session.getTransaction().rollback();
 30             }
 31         } finally{
 32             if (session != null) {
 33                 session.close();
 34             }
 35         }
 36     }
 37     
 38     @Test
 39     public void testPersistent() {
 40         Session session = null;
 41         try {
 42             session = HibernateUtil.openSession();
 43             session.beginTransaction();
 44             //当一个对象变为持久对象之后便被session所管理,在事务提交之前
 45             //持久对象若有变更,则会更新
 46             Student stu1 = new Student();
 47             stu1.setName("xiaoxiaoming");
 48             stu1.setGrade("六");
 49             session.save(stu1);
 50             //此处如果发送多条save,update,均没有意义,save命令发出之后,只会发送一条insert指令
 51             //在最后事物提交之前,stu1会和session中的stu1缓存对象进行对比,将最后的结果反映到数据库中
 52             //session.save(stu1);
 53             //session.update(stu1);
 54             
 55             //对象变为持久对象之后,对象本身所做的变更会反映到数据库中去,这里会发送update语句更新数据
 56             stu1.setName("dadaMing");
 57             
 58             session.getTransaction().commit();
 59             
 60         } catch (Exception e) {
 61             if (session != null) {
 62                 session.getTransaction().rollback();
 63             }
 64         } finally{
 65             if (session != null) {
 66                 session.close();
 67             }
 68         }
 69     }
 70     
 71     @Test
 72     public void testDetach() {
 73         Session session = null;
 74         try {
 75             session = HibernateUtil.openSession();
 76             session.beginTransaction();
 77             
 78             //某对象在数据库中存在记录,但是在session没有被管理,那么他就不会和数据库
 79             //进行状态同步
 80             Student stud = (Student) session.load(Student.class, 9);
 81             session.clear();
 82             //但是,如果没有清空session,那么stud对象就在session的管辖之内,stud对象的变更
 83             //都会以update语句反映到数据库中
 84             stud.setName("newName");            
 85             session.getTransaction().commit();
 86             
 87         } catch (Exception e) {
 88             if (session != null) {
 89                 session.getTransaction().rollback();
 90             }
 91         } finally{
 92             if (session != null) {
 93                 session.close();
 94             }
 95         }
 96     }
 97     
 98 }
 99     
100 

posted on 2015-01-20 08:57 都较瘦 阅读(72) 评论(0)  编辑  收藏 所属分类: ORMFramework


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

公告

博客定位:囿于目前的水平,博客定位在记录自己的学习心得和随手的练习

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜