Hibernate中,实体对象生命周期分为三种状态:Transient(瞬态)、Persistent(持久态)、Detached(游离态),下面把三种状态的概念说一下。
Transient(瞬态):即普通的实体对象,没有与数据库产生任何关联,比如
UserInfo userInfo = new UserInfo();
这个userInfo对象就是Transient。
Persistent(持久态):处于hibernate框架所管理的状态,与Session相关。比如
UserInfo userInfo = new UserInfo(); -->Transient
getSession().save(userInfo); -->执行过save后转化为Persistent
Detached(游离态):处理Persistent状态的对象,不再与session关联时,就转化为Detached。比如
UserInfo userInfo = new UserInfo(); -->Transient
getSession().save(userInfo); -->执行过save后转化为Persistent
getSession().close(); -->session关闭后,userInfo就转化为Detached
游离态肯定是由持久态转化而来的:持久态对象,当session执行close、clear、evict操作后,就转化为了游离态。
持久态可以由瞬态或游离态转化而来,也可以直接得到:瞬态、游离态对象执行save,update,saveorupdate等操作后,就会转化为持久态。
如果直接通过get、load、find、iterator等方法查询,得到的对象直接就是持久态。
瞬态也可以由持久态、游离态转化而来:从持久态、游离态执行delete操作后,对象就转化为了瞬态
掌握这些知识到底有什么用呢,其实是非常重要的,只有非常理解这三种状态,才能很好的理解API的操作。
比如:
save,update操作,只有对象为瞬态、游离态时才会真正执行,如果为持久态,它是直接返回的,因为持久态的对象不需要执行save操作,只要
属性改变,会直接引起数据库对应内容的改变。
saveOrUpdate操作,当为瞬态时执行save操作,当为游离态时,执行update操作,为持久态时,也什么都不做。
看一些示例来说明这个问题:
这段代码中的save方法是可有可无的,即使写上了也不会真正执行,因为对象直接get出来,处于持久态
内容的改变会直接引起数据库的改变,不用再执行save操作。
这段代码的update操作就是必须的了,因为通过evict方法将对象从持久态转化为了游离态。