merge attachDirty attachClean用法.

来源:互联网 发布:linux 复制覆盖文件 编辑:程序博客网 时间:2024/06/05 08:04

merge attachDirty attachClean用法.

2011-07-17 02:01:50| 分类: 默认分类 | 标签: |字号 订阅

大家对以下3个措施定然不面生,一些IDE生成的代码等闲都有下面三个措施:

public Person merge(Person detachedInstance) { log.debug("merging Person instance"); try { Person result = (Person) getSession().merge( detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } public void attachDirty(Person instance) { log.debug("attaching dirty Person instance"); try { getSession().saveOrUpdate(instance); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } public void attachClean(Person instance) { log.debug("attaching clean Person instance"); try { getSession().lock(instance, LockMode.NONE); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } }

merge:将传入的detached事态的对象的属性复制到永远化对象中,并归来该永远化对象 。万一该session中未曾关系的永远化对象,加载一个,万一传入对象未保留,保留一个副本并作为永远对象归来,传入对象依旧坚持detached事态。 

attachDirty:将传入的对象永远化并保留。万一对象未保留(Transient事态),调用save措施保留。万一对象已保留(Detached事态),调用update措施将对象与Session重新关系。 

attachClean:将传入的对象事态设置为Transient事态。 


解释一下,在Hibernate中的对象有三种事态,即: 
俄而事态(Transient)、永远事态(Persistent)、脱管事态(Detached) 

1、俄而事态(Transient) 
由new号召开发内存空间的Java对象,也即便平时所纯熟的等闲Java对象。 

如:Person p = new Person(); 
俄而对象个性: 
(1)不和Session实例关系 
(2)在数据库中未曾和俄而对象关系的登记 

2、永远事态(Persistent) 
永远的实例在数据库中有对应的登记,并具有一个永远化标识(identifier). 
永远对象总是与Session和Transaction相干联,在一个Session中,对永远对象的改换不会即刻对数据库举行改变,而定然在Transaction终止,也即便厉行commit()尔后,才在数据库中恳挚运行SQL举行改变,永远对象的事态才会与数据库举行同步。在同步之前的永远对象称为脏(dirty)对象。 
俄而对象转为永远对象: 
(1) 穿越Session的save()和saveOrUpdate()措施把一个俄而对象与数据库相干联,这个俄而对象就成为永远化对象。 
(2) 利用fine(),无线通讯模块get(),load()和iterater()待措施查询到的数据对象,将成为永远化对象。 
永远化对象的个性: 
(1) 和Session实例关系 
(2) 在数据库中有和永远对象关系的登记 

3、脱管事态(Detached) 
与永远对象关系的Session被关闭后,对象就变为脱管对象。对脱管对象的引用依旧管用,对象可继续被修正。 
脱管对象个性: 
(1) 性质上和俄而对象雷同 
(2) 只是比爱俄而对象多了一个数据库登记标识值id. 
永远对象转为脱管对象: 
当厉行close()或clear(),evict()尔后,永远对象会变为脱管对象。 

俄而对象转为永远对象: 
穿越Session的update(),saveOrUpdate()和lock()等措施,把脱管对象变为永远对象。