Hibernate对象就是java中的实体对象,管理就是在实体对象的生命周期内被Hibernate的操作,Hibernate对象的生命周期其实就是实体对象的生命周期(从创建到最后被GC回收),期间对实体对象的操作就是Hibernate对象生命周期管理。具体是使用Hibernate的API,对Hibernate的对象进行状态的切换,一般在临时状态,持久状态和游离状态三个之间进行。下面简单的记录下三种状态的特点以及如何使用API对其进行切换。
Hibernate对象的三种状态
(1)临时状态:内存中有对象,DB中没有数据,修改内存中的数据对DB中的没有影响
(2)持久状态:内存中有对象,DB中也有数据,通过操作内存中的对象可以修改DB中的数据
(3)游离状态:内存中有对象,DB中也有数据,对象与数据断开连接,修改对象不会影响DB中的数据
Hibernate对象状态的切换
Hibernate对象的三种状态可以实现切换,具体参考下图,选择合适的API,就能实现状态的变化。另外使用session的get方法得到的对象,这个对象就是持久状态,对其操作会影响DB中的数据。下图中从持久状态切换到游离状态有clear方法和evict方法,前者是将session中的所有对象进行清除,后者是只清除一个对象。
Hibernate对象状态切换测试
下面将通过以下几个测试来观察对不同状态Hibernate对象的操作,DB中数据的变化。
(1)对持久状态对象的操作
使用session对象get到student对象后,将名字修改为'new name',再查看DB中是否有变化。
测试代码:
//测试Hibernate对象管理,对持久状态的对象操作将影响数据库结果 @Test public void testUpdate() { Session session=getSession(); //开始事务 Transaction trans=session.beginTransaction(); trans.begin(); //使用get方法获取持久状态的对象 Student stu=(Student) session.get(Student.class, 4); System.out.println(stu); //修改对象的名字 stu.setName("new name"); System.out.println(stu); //提交事务 trans.commit(); //关闭session session.close(); }
测试前DB中情况:
测试后DB中的情况:
可以看出,对获取的对象操作,将直接影响DB中数据的结果,并且直接setName后,再次输出stu后name已更新为'new name'。
(2)测试从持久状态变成临时状态
从持久状态变成临时状态可以使用session的delete方法,获取刚才修改了名字的stu后,再将其delete,测试DB中的情况。
测试代码:
//测试从持久状态变到临时状态 @Test public void testDelete() { Session session=getSession(); //开始事务 Transaction trans=session.beginTransaction(); trans.begin(); //使用get方法获取持久状态的对象 Student stu=(Student) session.get(Student.class, 4); System.out.println(stu); //使用delete方法删除 session.delete(stu); System.out.println(stu); //提交事务 trans.commit(); //关闭session session.close(); }
测试前DB情况:
测试后DB情况:
测试发现使用delete方法后,数据库中没有了id为4,name为'new name'的这条记录,但是依然可以使用print方法打印出这个对象,说明对象依然存在内存中,DB中却没有了数据。
(3)测试从持久状态变成游离状态
从持久状态变成游离状态,使用evict方法,从当前session中清除出来,如果使用clear方法就是清除所有session中的对象。
测试代码:
//测试从持久状态变成游离状态,使用evict方法,从当前session中清除出来,如果使用clear方法就是清除所有session中的对象 @Test public void testEvict() { Session session=getSession(); //开始事务 Transaction trans=session.beginTransaction(); trans.begin(); //使用get方法获取持久状态的对象 Student stu=(Student) session.get(Student.class, 5); System.out.println(stu); //将对象从session中清除 session.evict(stu); //对对象进行操作,修改名字,看看是否对数据库数据有影响 stu.setName("new name"); System.out.println(stu); //提交事务 trans.commit(); //关闭session session.close(); }
测试前DB情况:
测试后DB情况:
测试发现当Hibernate对象变成游离状态后,对实体对象的操作不会影响DB中的数据。
(4)测试从游离状态回到持久状态
从游离状态回到持久状态,可以调用session的update方法,将上面id为5,name为'clyang'的对象名字修改为'new name'。但是在修改之前先将对象切换为游离状态,使用session的evict方法。
测试代码:
//测试从游离状态回到持久状态,可以调用update方法 @Test public void testObjUpdate() { Session session=getSession(); //开始事务 Transaction trans=session.beginTransaction(); trans.begin(); //使用get方法获取持久状态的对象 Student stu=(Student) session.get(Student.class, 5); System.out.println(stu); //将对象变成游离状态然后再后续操作 session.evict(stu); //对对象进行操作,修改名字,看看是否对数据库数据有影响 stu.setName("new name"); //使用session的update方法 session.update(stu); System.out.println(stu); //提交事务 trans.commit(); //关闭session session.close(); }
测试前DB情况:
测试后DB情况:
可以看出,当游离状态的stu对象更新name属性为'new name'后,再执行session的update方法,则DB中数据也发生了变化,说明将stu对象从游离状态又变回到了持久状态。
结论
Hibernate对象的生命周期就是Java实体对象的生命周期,对其生命周期的管理,是通过切换不同的状态来实现的,具体的三种状态分别为临时状态、持久状态和游离状态。