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

    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实体对象的生命周期,对其生命周期的管理,是通过切换不同的状态来实现的,具体的三种状态分别为临时状态、持久状态和游离状态。

  • 相关阅读:
    Ubuntu换源
    如何查看已购买的office密钥
    python的模块放在哪里
    centos7不能启动网卡报No suitable device found for this connection错误
    搭建邮件服务器 使用Postfix与Dovecot
    SSH远程免密码的密钥登录服务(Linux,Linux)
    SSH服务搭建、账号密码登录远程Linux虚拟机、基于密钥的安全验证(Windows_Xshell,Linux)
    apache基础,apache环境搭建,apache的3种使用方式(IP、端口、域名)
    Linux vsftpd服务配置以及三种验证方式以及常见错误解决办法
    使用DHCP动态管理主机地址
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/10901988.html
Copyright © 2020-2023  润新知