实际开发中使用hibernate获取到对象,在对数据做处理(将枚举类里的内容对应放进去)后重新set进对象,但发现数据里面的数据竟然被更新。才了解到hibernate获取对象分以下状态。
Hibernate分为三种基本的状态:游离态、自由态(临时状态)、持久态。
Session获得对象之后对对象进行set属性操作之后,此对象会update对应数据库当中的值。
其他两种状态:
1. 临时状态:就是直接new出来的对象,既没有持久化到数据库中去,也没有在session当中。
2. 游离状态:在Session中没有了,但是已经持久化到了数据库当中。
-----对于这两种状态的解决方式:
1.如果这个对象(例子中的company)本身不需要用的话,可以直接new一个Company的对象出来然后再setUsers这个时候因为不是Session中的数据,那么不会因为对象的属性发生改变而同步到数据库中去。
2.如果这个对象(例子中的company)要用的到,那么,在set之前可以先将其转为游离态,这样的话会用到session的几个方法:close、clear、evict。
close方法:关闭session这样这个对象肯定是游离态了,因为session已经关闭了,但是往往我们实际的开发过程中,session在后面是要用的到的,所以这个方法可行,但是不一定用得上,分清具体的情况。
clear方法:将session中的所有的对象全部清除出缓存,这个方式有点劳师动众,不过session清除了全部的对象之后自然就会变为游离态了,这样做不是很好吧我感觉。
evict方法:将某一个对象清除出缓存session,这个方法是很好的实现方式,推荐使用。调用的时候是这样的,session.evict(Objectobj);这样就可以了。