大家对以下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()等措施,把脱管对象变为永远对象。
联系客服