Hibernate是与应用创建的普通的java对象一起工作的,在原始状态(没有标签)Hibernate不会定义你的java类,但是当他们按照需要的标签进行标注之后,那么Hibernate就能识别他们,例如存储在数据库,更新他们的数值,这些对象的关系可以用Hibernate进行映射。
考虑到映射到Hibernate的对象实例,它可以有四种状态transient, persistent,detached或者 removed,我们现在就学习一下他们的四种状态。
瞬时状态对象
瞬时状态对象存在于堆内存中,Hibernate不管理瞬时状态或者把改变持久到瞬时状态中去
瞬时状态和Hibernate没有关系
为了把改变持久到瞬时状态中去,你需要session把瞬时对象保存到数据库中去,这时候Hibernate会给他唯一的标识,并把这个对象标识为持久状态
持久状态对象
持久状态对象存储在数据库中,Hibernate为持久化对象管理持久状态
持久对象由Hibernate管理
如果持久对象的值或者属性改变了,Hibernate在应用提交的时候会将数据库更新到最新的状态。
托管状态对象
托管状态对象在数据库中有一个表像,但是对这个对象的改变并不会反应到数据库中去,反之亦然。对象和数据库的短暂分离如下图所示
托管状态对象可以由其关联的正在关闭的session创建,或者是session调用清空方法的时候。为了把改变持久到托管状态对象,应用必须重新连上有效的Hibernate session,一个托管状态的实体可以在程序调用load, refresh, merge, update(), or save() 等方法的时候和新的Hibernate session联系在一起,最后,托管对象将会变成持久对象,然后由Hibernate session 管理。
删除状态对象
删除状态对象由Hibernate管理,当标注了这个状态的对象当session提交的时候,数据库中相应的实体对象将会被删除。
重要的点
1、新创建的POJO对象会是瞬时状态,瞬时状态并不会代表数据库中的记录,例如没有和任何的session对象相关连,它就是一个简单的java对象。
2、持久对象是数据库中的一行数据,并且和一些特定的Hibernate session相关联,持久对象的改变可以被Hibernate扑捉到,当提交的时候保存到数据库
3、托管状态对象是那些曾经的持久对象,现在不在持久的那些对象,为了把对象状态的改变持久进去,你可以重新把他们和Hibernate session像连接
4、移除状态的对象是session remove 方法调用之后得对象状态。
原文地址:http://howtodoinjava.com/2014/09/04/hibernate-entity-persistence-lifecycle-states/