Hibernate的update()和merge()的区别

在说hibernateupdate方法和marge方法时得先提以下hibernate bean对象的三种状态.

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

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

    3、脱管(Detached)-与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象假如重新关联到某个新的Session上,会再次转变为持久(Persistent)(Detached其间的改动将被持久化到数据库)这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)

    在了解了hibernatebean的三种状态后下面就好说update方法和marge'方法的区别了。

    update执行:

1. 首先在Session内部缓存中进行查找,如果发现则直接返回。

2. 执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。

3. 根据unsaved-value判断对象是否处于未保存状态。

4. 如果对象未保存(Transient状态),则调用save方法保存对象。

5. 如果对象未已保存(Detached状态),则调用update方法将对象与Session重新关联。

另外有一个图片:


transient:暂时的

persistent:持续的

detached:分离的,游离的

merge的意思是合并的意思。是合并两个session中的同一个对象,这句话的意思是,如果你修改了某个对象的值,marge会把原来的对象内容抛出,只保存更新之后的对象。

marge在合并两个对象之前会先执行一个select语句,查询时候有同一个对象,然后才会保存对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值