Hibernate对象的状态转换

Hibernate中的实体对象可以分为三种状态:Transient(临时)、Persistent(持久)、Detached(游离)

 Transient
用new创建出对象,这些对象还没有与数据库发生任何的关系,不对应于数据库中的任一笔数据;Persistent 对象通过调用delete()方法,也成为Transient 的,例:

Session session  =  sessions.openSession();
Transaction tx 
=  session.beginTransaction();
int  userID  =   1234 ;
User user 
=  (User) session.get(User. class new  Long(userID));
session.delete(user);
tx.commit();
session.close();

这种方法实际执行了delete sql语句。把Detached (脱管)对象转换成Transient (瞬时)的,例:

Session session  =  sessions.openSession();
Transaction tx 
=  session.beginTransaction();
session.delete(user);
tx.commit();
session.close();

将对象同Session 关联然后删除。

Persistent

当对象与数据库中的数据有对应关系,并且与Session实例有关联,并且Session实例尚未关闭,则它是在Persistent状态。例:Transient状态的对象使用Session的save()方法保存到数据库后,对象成为persistent状态,例:

DomesticCat fritz  =   new  DomesticCat();
fritz.setColor(Color.GINGER);
fritz.setSex(
' M ' );
fritz.setName(
" Fritz " );
Long generatedId 
=  (Long) session.save(fritz);
// 使用Hibernate从数据库得到数据并封装为对象(例如使用get()、load()),则该对象为Persistent状态
// get()
User user  =  (User) session.get(User. class new  Long(userID)); 
// load()
User user  =  (User) session.load(User. class new  Long(userID));
// get()和load()的区别在于:当要查找的对象数据不存在时,load()方法就是直接抛出异常,而get()方法则返回null值 
// Detached 状态对象重新和session关联后(通过update或lock方法)变成Persistent 状态,例:
/ update() 
// user是session1关闭后留下的脱管对象
user.setPassword( " secret " );
Session session2 
=  sessionFactory.openSession();
Transaction tx 
=  session2.beginTransaction();
session2.update(user);
user.setUsername(
" jonny " );
tx.commit();
session2.close();
// 这种方式,关联前后做修改都不打紧,关联前后做的修改都会被更新到数据库;
// 比如关联前你修改了password,关联后修改了username,事务提交时执行的update语句会把password、username都更新
// lock()
Session session2  =  sessions.openSession();
Transaction tx 
=  session2 .beginTransaction();
session2 .lock(user, LockMode.NONE);
user.setPassword(
" secret " );
user.setLoginName(
" jonny " );
tx.commit();
session2 .close();

这种方式,关联前后是否做修改很重要,关联前做的修改不会被更新到数据库,比如关联前你修改了password,关联后修改了loginname,事务提交时执行的update语句只会把loginname更新到数据库,所以,确信分离对象没有做过更改才能使用lock()。如果将Session实例关闭,则Persistent状态的对象会成为Detached状态。

Detached

Detached状态的对象,与数据库中的具体数据对应,但脱离Session实例的管理,例如:在使用load()、get()方法查询到数据并封装为对象之后,将Session实例关闭,则对象由Persistent状态变为Detached状态。

Detached状态的对象之任何属性变动,不会对数据库中的数据造成任何的影响。这种状态的对象相当于cache数据,因为他不和session关联,谁都可以用,任何session都可以用它,用完后再放到cache中。从上面看,hibernate对数据的处理确实比较聪明,一个session用完一个持久对象后,可以不删除这个对象,而是把它和session分离开,放到应用的cache中,其他session可以到cache中找需要的数据,但这导致了新的问题,和新的解决办法。

三种状态的转换图如下:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate中的对象状态主要包括四种:瞬时状态(Transient)、持久状态(Persistent)、游离状态(Detached)和删除状态(Removed)。这些状态之间的转换关系如下: 1. 瞬时状态(Transient):当一个Java对象被创建并且没有任何与之关联的Session时,这个对象处于瞬时状态。此时,如果将该对象保存到数据库中,Hibernate会将其插入到数据库中,并且为其分配一个ID。 2. 持久状态(Persistent):当一个瞬时对象被关联到一个Session时,该对象就成为持久状态。此时,Hibernate会将该对象的信息保存到Session的缓存中,并将其与数据库中的记录建立关联。此时对该对象的任何修改都会被保存到数据库中。 3. 游离状态(Detached):当一个持久对象Session的关联被解除时,该对象就成为游离状态。此时,Hibernate不再跟踪该对象状态,也不会将其修改保存到数据库中。如果需要更新该对象的信息,需要重新关联到Session中。 4. 删除状态(Removed):当一个持久对象被标记为删除时,该对象就成为删除状态。此时,Hibernate会将该对象的删除标记保存到Session的缓存中,并在提交事务时将其从数据库中删除。 需要注意的是,状态转换的过程是动态的,一个对象可能在不同的时间处于不同的状态Hibernate会根据对象状态自动执行相应的操作,开发者可以通过设置对象状态来实现对数据库的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值