【SSH】——Hibernate(1)持久化对象转换

      一、Hibernate生命周期


      实体对象的生命周期在Hibernate应用中是一个很关键的概念,正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用.而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程.在这过程中我们需要理解的就是实体对象生命周期中的三种状态.瞬时状态(Transient)、持久化状态(Persistent)和离线状态(Detached也叫做脱管状态)。


               


      二、三种状态


      1、瞬时状态(Transient)

      使用new操作符初始化对象,并不是立刻就持久。在没有保存为数据库中的任何一个数据的时候,他们的状态都是瞬时的。或者说他们没有任何跟数据库表相关联的行为,也没有主键值,只要应用不再引用这些对象,他们的状态将会丢失,并由垃圾回收机制回收。如:


public void TestA{
	//这里的user对象,与数据库中的记录没有任何关联
	TUser user=new TUser();
	user.setName("yxm");
}

      特点:不和任何一个Session实例关联。在数据库中没有对应的记录。


      2、持久化状态(Persistent)

      保存到数据库中后或者从数据库中取出的数据封装为对象,此时内存中的对象和数据库中的记录有对应关系,即和Session对象相关且Session对象尚未关闭,则此时实体对象处于Persistent状态。如果此时Session对象的delete方法删除记录,则Persistent状态的对象因为失去了对应资料,将会变成Transient状态。持久化对象由Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束的时候同数据库进行同步。如:


<span style="font-family:Microsoft YaHei;font-size:18px;">TUser user=new TUser();
TUser anotherUser=new TUser();
user.setName("yxm");
anotherUser.setName("Judy");
//此时user和anotherUser都处于Transient状态
Transaction tx=session.beginTransaction();
session.save(user);
//此时的user对象已经由hibernate纳入实体管理容器,处于persistent状态
//anotherUser仍是transient状态
tx.commit();
//事务提交后,数据库中插入一条用户yxm的记录,对anotheruser没有任何操作

Transaction tx1=session.beginTransaction();
user.setName("yxm_1");   //persistent
anotherUser.setName("Judy_1"); //transient

tx1.commit();
//虽然tx1事务中没有显示调用session.save方法保存user对象
//但是由于处于persistent状态的对象将自动被固化到数据库中,因此
//user对象的变化也将被同步到数据库中
//yxm的用户记录已经被更新为“yxm_1”

//时anotherUser仍然是一个普通java对象,处于transient状态,不受hibernate框架管理
//因此其属性的更改也不会对数据库产生影响
</span>

      可以看到,处于transient状态的实体对象,可以通过session.save方法转换为persistent状态。同样,如果一个实体对象是由session.load方法获得,也处于persistent状态。

      特点:持久化对象总是被一个session实例关联。和数据库中的相关记录对应。session在清理缓存时,会持久化对象的属性变化,来同步更新数据库。


      3、托管状态(Detached)

      Session关闭之后,持久化对象就变成detached对象。表示这个对象不能再与数据库保持同步,他们不再受到Hibernate管理。位于Detached状态的对象可以使用update方法使之与数据库中的记录重新发生关联,此时Detached状态的对象将变为Persistent状态。如:

<span style="font-family:Microsoft YaHei;">TUser user=new TUser();
user.setName("yxm");
//此时user处于transient状态

Transaction tx=session.beginTransaction();
session.save(user);
//此时的user对象已经由hibernate纳入实体管理容器,处于persistent状态
tx.commit();

session.close();
//user对象此时状态为detached,以为与其关联的session已经关闭

Transaction tx1=session2.beginTransaction();
session2.update(user);
//此时处于detached状态的user对象再次借助session2由hibernate纳入管理器,回复persistent状态
user.setName("yxm_1");
//由于user对象再次处于persistent状态,因此其属性变更将自动由hibernate固化到数据库中
tx1.commit();
</span>

      特点:不再位于session的缓存中,即它不再和session关联。它拥有持久化标识。

      总结:

      Transient和Detached状态的对象都不收hibernate持久层所管理,对这两个状态中的对象做任何属性的改变都不会对数据库中的资料有任何的影响。但是两者有什么区别呢?

      detached状态的对象,在执行save方法时,已经对对象进行了持久化,并赋予其主键值,可以唯一确定数据库表中的一条记录,能和数据库表中具备相同id值的记录相关联。只不过由于detached对象脱离了session这个数据操作平台,其状态改变无法更新到数据库中。而transient状态的对象与数据缺乏对应关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值