Hibernate对象的三种状态

Hibernate对象的三种状态

瞬时的(Transient)
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时对象在程序中没有被引用,它会被Java垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态(Hibernate会自动执行必要的SQL语句)。

持久的(Persistent)
一个持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session的作用范围内。Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象的状态同步到数据库,开发者不需要手动执行UPDATE语句。同样的,将一个对象变为瞬时(Transient)状态,也不需要手动执行DELETE语句。

分离的(又叫托管的)(Detached)
与持久对象关联的Session被关闭后,对象就变为分离的(Detached)的。 对分离对象的引用仍然是有效的,对象可以继续被修改。分离对象如果重新关联到某个新的Session上, 会再次转变为持久的(在Detached其间的改动将被持久化到数据库中)。

Session session=factory.openSession();
User user=new User();       
//user对象处于瞬时状态。
user.setName("张三");
user.setAge(18);
Transaction tran=Session.beginTransaction();
session.save(user);
//user对象处于持久状态。
tran.commit();               
session.close();
//user对象处于分离状态。
user.setName("李四");
Session session2=factory.openSession();
Transaction tran2=Session2.beginTransaction();
Session2.update(user);
//user对象处于持久状态。
tran2.commit();    (分离状态中对象的变动在再次持久时回被持久化到数据库)
    
Transaction tran3=Session.beginTransaction();
Session2.delete(user);
//user对象处于瞬时状态。
tran3.commit();
session2.close();

Session的不同操作对对象状态的影响

Session的save()方法
          save()方法将一个瞬时对象转变为持久对象。
Session的update()方法
          update()方法将一个分离对象转变为持久对象。
Session的lock()方法
          调用lock()方法将对象同Session相关联而不强制更新。
Session的merge()方法
          拷贝指定对象的状态到具有相同对象标识符的持久对象。
Session的saveOrUpdate()方法
          saveOrUpdate()方法对于瞬时对象,执行save()方法,对于分离对象,执行update()方法。

Session的load()和get()方法
          load()方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
Session的delete()方法
          delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条delete语句。如果传入的参数是分离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
Session的evict()方法
          evict()方法从Session的缓存中删除一个持久对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值