持久化对象的状态

1.临时对象

(1)OID通常为null

(2)不处于session缓存中

(3)在数据库中没有对应记录

2.持久化对象(“托管”)

(1)OID不为null

(2)  位于Session缓存中

(3)  持久化对象和数据库中的相关记录对应

(4)  Session在flush缓存时,会根据持久化对象的属性变化,来同步更新数据库

(5)  在同一个Session实例的缓存中,数据库表中的每条记录对应唯一的持久化对象

3.删除对象

4.游离对象

(1)OID不为null

(2)不再处于Session缓存中

 

持久化对象的状态

1.save()方法

(1)使一个临时对象变为持久化对象

(2)为对象分配ID

(3)在flush缓存时会发送一条INSERT语句

(4)在save方法之前的id是无效的

(5)持久化对象ID是不能被修改的

2.persist()方法

(1)也会执行INSERT操作

(2)在persist方法前若对象已有ID,则不会执行INSERT,抛出异常

3.get和load方法

(1)执行get方法,立即加载对象;(立即检索)

         执行load方法,若不使用该对象,则不会立即执行查询,而返回一个代理对象(延迟检索)

(2)若数据表中没有对应记录:

         get返回null

         load抛出异常(若不使用该对象的任何属性,则不会异常)

(3)load方法 可能会抛出LazyInitialazationException异常

         因为在需要初始化代理对象之前已经关闭了Session

4..update方法

(1)若更新一个持久化对象,不需要显示调用update方法。

         因为在调用Transaction的commit()方法时,会先执行session的flush方法。

(2)更新一个游离对象,需要显示的调用session的update方法,可以把一个游离对象变为持久化对象。

注意:

(1)无论更新的游离对象和数据表的记录是否一致,都会发送UPDATE语句。

(2)若数据表中没有对应的记录,但调用update方法会抛出异常

5.delete方法

(1)只要OID和数据表中一条记录对应,就会准备执行delete操作

         若OID在数据表中没有对应的记录,则抛出异常

6.evict方法

(1)从session缓存中将指定的持久化对象移除