持久化对象的状态
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缓存中将指定的持久化对象移除