在说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语句,查询时候有同一个对象,然后才会保存对象。