Hibernate中Java的三种状态
java对象的三种状态
当应用通过调用Hibernate API 与框架进行交互时,需要从持久化的角度关注应用对象的生命周期。持久化生命周期是Hibernate中一个很重要的概念,Hibernate通过Session来管理Java对象的状态,在持久化生命周期中,Java对象存在三种状态。
1.瞬时状态(Transient)
Student stu = new Student();
瞬时状态又称临时状态,对象只存在于Java 堆内存中,与数据库中的数据没有任何关联,即Java对象在数据库中没有相关联的记录,此时Java对象为瞬时状态。Session对瞬时状态的对象一无所知。
2.持久状态(Persistent)
我学习的理解后认为满足以下3点的对象就处于持久状态
1. 对象存在与Java内存中
2. 与Session关联,被Session管理
3. 在数据库中拥有数据库表示(数据库中的主键值)
这里对象什么时候与Session进行关联的呢?
1. 通过Session的查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录相对应的,此时Java 对象与Session发生第一次关联。
2. 对瞬时状态的对象调用Session的save()、saveOrUpdate()等方法时,在保存对象数据的同时,Java对象也会与Session发生关联,
对于处于持久化状态的对象,Session会持续跟踪和管理它们,如果对象内部的状态发生了任何改变,Hibernate会选择合适的时机(如commit时)将变更同步数据到数据库中
3.游离状态(Detached)
游离状态又称脱管状态,处于持久化的对象,脱离了与其关联的Session的管理后,对象就处于游离状态。
处于游离状态的对象,Hibernatre无法保证对象所包含的数据与数据库中的记录一致,因为Hibernate已经无法感知对该对象的任何操作,
Session提供了saveOrUpdate()、update()等方法可以将处于游离状态的对象的数据以更新的方式同步到数据库中,并将该对象与当前的进行Session关联。
这时对象的状态就由游离状态重新装换为持久状态
三种状态的转换
百度盗图QAQ
1. 瞬时转为持久
使用Session的save()、saveOrUpdate() 等方法保存对象后,该对象的状态即转为持久状态
使用Session的get()、load()方法获取对象,该对象的状态时持久状
2. 持久转为瞬时
使用Session的delete()方法后,失去Session管理,失去与数据库的关联。
3. 持久转为游离
执行Session 的evict()(由session缓冲中移除单个指定对象)、clear()(移除所有)、close()方法。
3. 游离转为持久
执行Session的update()、或者saveOrUpdate(),将对象重新与Session关联
3. 游离转为瞬时
执行Session的delete()方法
当处于游离状态和瞬时状态的对象不再被其他对象引用时,会被JVM按照垃圾回收机制处理