Hibernate 对象状态

转自:http://davidwei05951983.spaces.live.com/Blog/cns!BED3D557991594B3!811.entry

 

Hibernate定义并支持下列对象状态(state):

 

1.瞬时(Transient) 

   由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)

 

2.持久(Persistent)

   持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。

   持久对象具有如下特点:
   1). 和session实例关联;
   2). 在数据库中有与之关联的记录。

 

3.脱管(Detached)

   与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。

   脱管对象具有如下特点:

   1). 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
   2). 比瞬时对象多了一个数据库记录标识值。

 

   save与update:save存储一个新的对象(瞬时-持久),update更新原来对象的值到数据库,此时对象应该要有一个标识,因此是(脱管-持久)。
 

   saveOrUpdate:saveOrUpdate包括了save和update。在saveOrUpdate时,如果对象是瞬时态,则对其save,如果对象是脱管态,则调用update,如果是持久态,则不做任何事(但注意,如果不自己sessoin的持久态对象,与本 session中另一个持久态对象含有同一个标识的话将抛出异常)。

 

 

你可能感兴趣的:(jvm,sql,Hibernate,Blog)