hibernate的对象三种状态说明

hibernate的对象三种状态
    transient(瞬时)
    persistent(持久化)
    detached(游离)

瞬时状态:
    1.刚new出来一个对象obj,obj在内存孤立存在,obj是携带信息的载体,obj没有被保存到数据库中(换句话:obj没有被session进行持久化)
    扩展知识:
       没有变量引用该对象,它将被垃圾回收器(gc)回收;
持久化状态:
    1.该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识
    2.和session实例关联;
游离状态:
    游离对象拥有数据库的识别值,但已不在持久化管理范围之内(session中不存在该对象)。
    游离对象具有如下特点:
        (1)本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
        (2)比瞬时对象多了一个数据库记录标识值. 
    打比方:我们可以认为session对象就是一个持久化对象的宿主,
    一旦这个宿主失效,那么这个实体就处于游离状态. 

Session的调用不同方法,对对象的不同影响:
save()方法 ---- 将一个临时对象转变为持久对象。
update()方法 ---- 将一个游离对象转变为持久对象。
lock()方法 ---- 将对象同Session相关联而不强制更新。
merge()方法 ---- 拷贝指定对象的状态到具有相同对象标识符的持久对象。
saveOrUpdate() ---- 方法对于临时对象,执行save()方法,对于游离对象,执行update()方法。
load() 方法和get()方法 ---- 可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
delete()方法 ---- 从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条 delete语句。如果传入的参数是游离对象,先使分离对象与                         Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
evict()方法 ---- 从Session的缓存中删除一个持久对象。

游离对象和临时对象异同:
    两者都不会被Session关联,对象属性和数据库可能不一致;
    
    瞬时状态:对象缺乏与数据库表记录之间的联系,
    游离状态:只不过是脱离了session这个数据库操作平台而已,
    游离对象的引用依然有效(在内存中还有对象),对象可以继续被修改,当它重新被关联到某个新的Session上时,
    会再次变成持久对象(脱管状态期间的改动将被持久化到数据库上)。
    游离对象拥有数据库识别值id,所以它可以通过update(),saveOrUpdate(),lock()等方法,
    再度与持久层关联。
    
注意一下几点:
    1. 如果一个持久化状态对象A,对该对象A进行各种修改,或者调用多次update、save方法,
    hibernate都不会发送sql语句,只有当事务提交,hibernate才会拿当前对象A与之前保存在session中的持久化对象进行比较,
    如果不相同就发送一条update的sql语句,否则就不会发送update语句
    2. 通过调用save方法、update方法或saveOrUpdate()方法可以使该对象变成持久化对象,
    如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比
    较,如果不同,则发送一条update语句,否则就不会发送update语句.
    
    3. session.clear(),会将session的缓存对象清空
    
    4. 试图修改一个持久化对象的ID的值的话,就会抛出异常
    5. 在session的缓存中不能存在两份拷贝,否则会抛出异常
    6. session的merge方法,作用是解决一个持久化对象两份拷贝的问题,该方法会将两个对象合并在一起成为一个对象。
    7. 持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化 对象是脏的(Dirty)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值