Hibernate中的对象状况,及主动更新原因
添加时间:2013-7-30 点击量:
Hibernate的对象有三种状况,分别为:瞬时状况 (Transient)、 持久化状况(Persistent)、游离状况(Detached)。对它的深切懂得,才干更好的懂得hibernate的运行机理。
一. 瞬时状况(Transient)
由new号令开辟内存空间的java对象,它没有持久化,没有处于Session中,处于此状况的对象叫瞬时对象。例:
Person person = new Person(韩梅梅, 女);
若是没有变量对该对象进行引用,它将被java虚拟机收受接管。
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数占领任何接洽关系关系,在Hibernate中,可经由过程session的save()或saveOrUpdate()办法将瞬时对象与数据库相接洽关系,并将数据对应的插入数据库中,此时该瞬时对象改变成持久化对象。
二.持久化状况(Persistent)
已经持久化,参加到了Session缓存中。
处于该状况的对象在数据库中具有对应的记录,并拥有一个持久化标识。若是是用hibernate的()办法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录接洽关系。
当一个session履行close()或clear()、evict()之后,持久对象变成脱管对象,此时该对象固然具稀有据库辨认值,但它已不在HIbernate持久层的经管之下。
持久对象具有如下特点:
1. 和session实例接洽关系;
2. 在数据库中有与之接洽关系的记录。
三.游离状况(Detached)
当与某持久对象接洽关系的session被封闭后,该持久对象改变为脱管对象。当脱管对象被从头接洽关系到session上时,并再次改变成持久对象。
脱管对象拥稀有据库的辨认值,可经由过程()、saveOrUpdate()等办法,改变成持久对象。
脱管对象具有如下特点:
1. 本质上与瞬时对象雷同,在没有任何变量引用它时,JVM会在恰当的时辰将它收受接管;
2. 比瞬时对象多了一个数据库记录标识值。
下面我来说一下,很多伴侣曾问我他并没有看到更新的代码,然则数据库里的数据却更新了,这个题目就是Hibernate导致的。
在一个事务中,若是为某持久化对象set了新的值,那么在提交事务时,Hibernate就会去斗劲你哪些持久化对象产生了变更,若是找到了,就会主动更新到数据库中。(重视,若是在事务外做的操纵,Hibernate是不会帮你更新的)
在网上看到有人说游离态的对象若是更改属性也会主动更新,这个我就不做测试了,大师碰到可以试一试。
若是想避免这种景象:
一.在事务外面操纵该对象;
二.克隆一个该对象。
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
Hibernate的对象有三种状况,分别为:瞬时状况 (Transient)、 持久化状况(Persistent)、游离状况(Detached)。对它的深切懂得,才干更好的懂得hibernate的运行机理。
一. 瞬时状况(Transient)
由new号令开辟内存空间的java对象,它没有持久化,没有处于Session中,处于此状况的对象叫瞬时对象。例:
Person person = new Person(韩梅梅, 女);
若是没有变量对该对象进行引用,它将被java虚拟机收受接管。
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数占领任何接洽关系关系,在Hibernate中,可经由过程session的save()或saveOrUpdate()办法将瞬时对象与数据库相接洽关系,并将数据对应的插入数据库中,此时该瞬时对象改变成持久化对象。
二.持久化状况(Persistent)
已经持久化,参加到了Session缓存中。
处于该状况的对象在数据库中具有对应的记录,并拥有一个持久化标识。若是是用hibernate的()办法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录接洽关系。
当一个session履行close()或clear()、evict()之后,持久对象变成脱管对象,此时该对象固然具稀有据库辨认值,但它已不在HIbernate持久层的经管之下。
持久对象具有如下特点:
1. 和session实例接洽关系;
2. 在数据库中有与之接洽关系的记录。
三.游离状况(Detached)
当与某持久对象接洽关系的session被封闭后,该持久对象改变为脱管对象。当脱管对象被从头接洽关系到session上时,并再次改变成持久对象。
脱管对象拥稀有据库的辨认值,可经由过程()、saveOrUpdate()等办法,改变成持久对象。
脱管对象具有如下特点:
1. 本质上与瞬时对象雷同,在没有任何变量引用它时,JVM会在恰当的时辰将它收受接管;
2. 比瞬时对象多了一个数据库记录标识值。
下面我来说一下,很多伴侣曾问我他并没有看到更新的代码,然则数据库里的数据却更新了,这个题目就是Hibernate导致的。
在一个事务中,若是为某持久化对象set了新的值,那么在提交事务时,Hibernate就会去斗劲你哪些持久化对象产生了变更,若是找到了,就会主动更新到数据库中。(重视,若是在事务外做的操纵,Hibernate是不会帮你更新的)
在网上看到有人说游离态的对象若是更改属性也会主动更新,这个我就不做测试了,大师碰到可以试一试。
若是想避免这种景象:
一.在事务外面操纵该对象;
二.克隆一个该对象。
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》