hibernate對象含有三種狀態(tài),瞬時,持久和離線。簡而言之就是,瞬時對象和hibernate session沒關(guān)系,持久對象就是和hibernate session有關(guān)系,并且當前事物還沒有提交,持久對象的所有變化都會反映到數(shù)據(jù)庫中,最后,離線對象就是和hiberante session有過關(guān)系,但是事物已經(jīng)提交了,離線對象已經(jīng)脫離了hibernate session的管理,自身的狀態(tài)不會反映到數(shù)據(jù)庫中。下面通過幾個測試案例感受一下。
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 //省略相關(guān)工具類和實體類
13 @Test
14 public void testTransien() {
15 Session session = null;
16 try {
17 session = HibernateUtil.openSession();
18 session.beginTransaction();
19
20 //對hibernate而言,stu1對象和session沒有任何關(guān)聯(lián),所以該對象不會反映到數(shù)據(jù)庫中
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 //當一個對象變?yōu)槌志脤ο笾蟊惚籹ession所管理,在事務(wù)提交之前
45 //持久對象若有變更,則會更新
46 Student stu1 = new Student();
47 stu1.setName("xiaoxiaoming");
48 stu1.setGrade("六");
49 session.save(stu1);
50 //此處如果發(fā)送多條save,update,均沒有意義,save命令發(fā)出之后,只會發(fā)送一條insert指令
51 //在最后事物提交之前,stu1會和session中的stu1緩存對象進行對比,將最后的結(jié)果反映到數(shù)據(jù)庫中
52 //session.save(stu1);
53 //session.update(stu1);
54
55 //對象變?yōu)槌志脤ο笾螅瑢ο蟊旧硭龅淖兏鼤从车綌?shù)據(jù)庫中去,這里會發(fā)送update語句更新數(shù)據(jù)
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 //某對象在數(shù)據(jù)庫中存在記錄,但是在session沒有被管理,那么他就不會和數(shù)據(jù)庫
79 //進行狀態(tài)同步
80 Student stud = (Student) session.load(Student.class, 9);
81 session.clear();
82 //但是,如果沒有清空session,那么stud對象就在session的管轄之內(nèi),stud對象的變更
83 //都會以update語句反映到數(shù)據(jù)庫中
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