• 【Hibernate框架】对象的三种持久化状态


    一、综述

              hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象)、PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线对象)。

    二、Hibernate对象三种状态转化图:

    三、Hibernate对象三种状态简介及转化条件:

    (1)临时状态:

           由Java的new命令开辟内存空间的java对象也就是普通的java对象,如果没有变量引用它它将会被JVM收回。简单的说就是程序里面new一个对象,还没有和session关联

    (1.1)临时状态——>持久化状态:

           临时对象在内存中是孤立存在的,它的意义是携带信息载体,不和数据库中的数据由任何的关联。通过Session的save()方法和saveOrUpdate()方法可以把一个临时对象和数据库相关联,并把临时对象携带的信息通过配置文件所做的映射插入数据库中,这个临时对象就成为持久化对象。

    (2)持久化状态:

           对象和session有了关联,对象处于hibernate框架管理中.持久化对象在数据库中都有相应的记录,持久化对象可以是刚刚被保存的,也可以是调用get或者load方法刚刚加载的,但都是在相关联的session生命周期中保存这个状态。如果是直接从数据库中查询所返回的数据对象,那这些对象和数据库中的字段相关联,具有相同的id,他们马上变成持久化对象。如果一个临时对象被持久化对象引用,也马上会变为持久化对象。

    (2.1)持久化状态——>临时状态

           使用delete()方法,持久化对象变为临时对象,并且删除数据库中相应的记录,这个对象不再与数据库有任何的联系。

    (2.2)持久化状态——>离线对象

          当一个session()执行close()、clear()、或evict()之后,持久化对象就变为离线对象,这时对象的id虽然拥有数据库的识别值,但已经不在Hibernate持久层的管理下,他和临时对象基本上一样的,只不过比临时对象多了数据库标识id。没有任何变量引用时,jvm将对其进行回收。

           持久化对象总是与Session和事务(Transaction)关联在一起,在一个session中,对持久化对象的操作不会立即写到数据库,只有当Transaction(事务)结束时也就是提交事务执行commit方法的时候,才真正的对数据库更新,从而完成持久化对象和数据库的同步。在同步之前的持久化对象成为脏对象。

    (3)托管对象(离线状态):

           在持久态的情况下,对象和session失去了关联,比如session.close()或session.evite(obj) 后,即游离态,但数据已经存储到了数据库。Session关闭之后,与此Session关联的持久化对象就变成为脱管对象,可以继续对这个对象进行修改,如果脱管对象被重新关联到某个新的Session上,会在此转成持久对象。脱管对象虽然拥有用户的标识id,所以通过update()、saveOrUpdate()等方法,再次与持久层关联。

    (3.2)离线状态——>临时状态

          执行Delete方法。

    四、代码演示:

    1. public class SessionTest extends TestCase {  
    2.     public void testSave1()  
    3.     {  
    4.         Session session = null;  
    5.         Transaction tx = null;  
    6.         try  
    7.         {              
    8.             session = HibernateUtils.getSession();//取得session.  
    9.             tx = session.beginTransaction();//开启事务. 返回 transient的一个实例.  
    10.                
    11.             User user = new User();//这里通过new一个User类型的对象,产生一个Transient(临时)状态的对象.  
    12.             user.setName("张三");  
    13.             user.setPassword("123");  
    14.             user.setCreateTime(new Date());  
    15.             //缓存的时候(脏数据检查)的时候,会和数据库同步.  
    16.             session.save(user);//进行保存.执行save则对session进行管理,对象变为持久化状态.发出insert语句,自动生成user表的标识id值  
    17.             user.setName("李四");//持久化(persistent)状态的对象.会发出update语句,当对象的属性发生改变的时候,hibernate在清理          
    18.             tx.commit();//进行提交,关闭事务.  
    19.         }catch(Exception e)  
    20.         {  
    21.             e.printStackTrace();  
    22.             if(tx!=null)  
    23.             {  
    24.                 // 事务回滚.  
    25.                 tx.rollback();  
    26.             }  
    27.         }finally  
    28.         {  
    29.             HibernateUtils.closeSession(session);//关闭session.当关闭session后处于Detached(离线)状态.  
    30.         }  //这时候,就不能再用以前的session了再想将此对象变为持久化对象需要重新得到新的session,开启事务,将此对象纳入session管理         
    31.     }  

        日志记录:

         

    1. Hibernate: insert into User (name,password,createTime) values (?,?,?,?)  
    2. Hibernate: update User set name=?,password=?,createTime=? where id=?  
  • 相关阅读:
    IDEA热部署插件Jrebel
    Navicat Premium15安装及破解教程
    IDEA中查看类的关系图
    PV、UV、IP名词解释
    Promise由浅入深
    URLSearchParams
    二进制流学习-Blob、ArrayBuffer、File、FileReader和FormData的区别
    前端vue以数据流方式导出word----借助 jquery
    js中 == 、=== 和 Object.is() 的区别
    后端传的是二进制流,前端应该如何通过blob处理二进制文件流格式流,并实现前端下载文件流格式
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/6243236.html
Copyright © 2020-2023  润新知