SSH学习-Hibernate对象生命周期管理

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中的所有对象进行清除,后者是只清除一个对象。

SSH学习-Hibernate对象生命周期管理

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中情况:

SSH学习-Hibernate对象生命周期管理

测试后DB中的情况:

SSH学习-Hibernate对象生命周期管理

SSH学习-Hibernate对象生命周期管理 

可以看出,对获取的对象操作,将直接影响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情况:

SSH学习-Hibernate对象生命周期管理

测试后DB情况:

SSH学习-Hibernate对象生命周期管理

 SSH学习-Hibernate对象生命周期管理

测试发现使用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情况:

SSH学习-Hibernate对象生命周期管理

测试后DB情况:

SSH学习-Hibernate对象生命周期管理

SSH学习-Hibernate对象生命周期管理

测试发现当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情况:

SSH学习-Hibernate对象生命周期管理

测试后DB情况:

SSH学习-Hibernate对象生命周期管理

SSH学习-Hibernate对象生命周期管理

可以看出,当游离状态的stu对象更新name属性为'new name'后,再执行session的update方法,则DB中数据也发生了变化,说明将stu对象从游离状态又变回到了持久状态。

结论

Hibernate对象的生命周期就是Java实体对象的生命周期,对其生命周期的管理,是通过切换不同的状态来实现的,具体的三种状态分别为临时状态、持久状态和游离状态。