溫故知新: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 都較瘦 閱讀(79) 評論(0)  編輯  收藏 所屬分類: ORMFramework

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          公告

          博客定位:囿于目前的水平,博客定位在記錄自己的學習心得和隨手的練習

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 静乐县| 阿鲁科尔沁旗| 新余市| 八宿县| 鱼台县| 潮安县| 石河子市| 竹山县| 南雄市| 子洲县| 临沧市| 锦屏县| 九龙城区| 于田县| 大名县| 黄陵县| 柯坪县| 凤山市| 石棉县| 界首市| 霸州市| 灵武市| 郴州市| 南宫市| 邓州市| 手游| 新野县| 清河县| 枣阳市| 萝北县| 大渡口区| 宜黄县| 巫溪县| 财经| 阿城市| 虞城县| 阳西县| 甘德县| 科技| 翁牛特旗| 海宁市|