hibernate入门(四)对象三种状态

1 .瞬时(transient ):数据库中没有数据与之对应,超过作用域会被JVM 垃圾回收器回收,一般是new 出来的且与Session 无关系的对象。

2 .脱管- 游离(detached ):数据库中有数据与之对应,但当前没有Session 与之关联:脱管对象状态发生改变,Hibernate 不能检测到。

3 .持久(persistent) :数据库有数据与之对应,当前与Session 有关联,并且相关联的Session 没有关闭,事务没有提交:持久对象状态发生改变时,在事务提交时会影响到数据库。

理解 :与Session 是否关联,数据库是否有数据与之对应是判断三种对象状态的依据。比如,瞬时状态跟它们均无关;脱管,只是数据库有数据与之对应,失去了Session 对它的管理;而持久与两者者有关。

从过程中理解三种对象状态 :结合前面的实例,当我们User user=new User() 一个对象时,它表示创建一个瞬时对象,当调用save(user) 方法时,这个对象成为持久对象,直到事务提交,数据库连接关闭。在这期间,如果我们user.setXXX() 时,会对这个持久对象产生影响,最终它也会被提交到数据库,它的最终提交是在提交事务时。比如save(user) 方法后,跟 user.setName( "new name" );user.setPassword( "new password" ); 这两句,这样它会在提交时务时,采取对数据库的更新操作,也就是说数据库连接关闭后,数据库存的是“new name ”和“new password ” 而如果开启了“数据库语言显示”可以发现执行两次操作:一次是save 方法的插入操作,一次是setXXX 后提交事务时的更新作(特别说明,持久对象在发生改变时,比如setXXX 方法改变对象内容时,会在最后,即提交事务时统一进行更新操作,而并非每一次改变就执行一次更新,这样可以保证与数据库的交互更高效合理)。当执行完save 方法后,我们关闭数据库连接时,这时的user 对象就是脱管状态,因为它在数据库有数据与之对应 而脱管状态的最好例子是当我们用get 方法得到一个对象并关闭连接时

补充说明: 既然我们已经知道了持久对象可以被Hibernate 检测到进行更新操作,那么update 是否还有用了?有,比如脱管对象就可以调用update 来更新数据库中的数据,而调用update() 方法后的脱管对象又变成了持久对象。 下面是三种对象状态相互转换的图例

 

 
再谈saveOrUpdate 方法 :此方法兼具了saveupdate 两种方法。它根据传递的参数来选择执行其中的一种方法。如果参数对象是瞬时态,则执行save 方法,而如果参数对象是脱管态,则执行update 方法。最终都是把传递的参数对象转成持久态。        如何判断对象的状态?主要依据是看:实体对象id (或者version )取值与实体配置文件中<id> 元素的unsaved-value 属性值的匹配情况。 只要满足下面的任一情况则可以说明对象处在瞬时态:情况一 ,实体对象(持久化对象)的id 取值为null 形式(比如int 型为0, 字串为null )。 情况二 ,实体对象(持久化对象)的id 取值与预设的unsaved-value 属性值不同。 情况三 ,实体对象(持久化对象)的具有的versionn 属性,并且为null情况四 ,实体对象(持久化对象)的version 取值与预设的unsaved-value 属性值不同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值