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