您的位置:首页 > 其它

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

2013-09-09 23:33 435 查看
在说hibernate的update方法和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语句,查询时候有同一个对象,然后才会保存对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐