一、持久化对象的状态
站在持久化的角度,Hibernate把对象分为4种状态
1.临时状态
在使用代理主键的情况下,OID通常为null
不处于Session的缓存中
在数据库中没有对应的记录
这就好比公司的一个零时工,不受公司规章制度的监管(几点上班,几点下班),公司员工库里面也没有该员工的信息。
2.游离状态
OID不为null
不再处于Session缓存中
一般情况需下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录。
这就好比一个请假员工
3.持久状态
OID不为null
位于Session缓存中
若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
Session在flush缓存时,会根据持久化对象的属性变化,来同步更新数据库
在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象
这就好比公司的一个正式员工,有员工号,并且属于公司的监管下。
4.删除状态
在数据库中没有和其对应的OID记录(曾今有)
不再处于Session缓存中
一般情况下,应用程序不该再使用被删除的对象
这就好比一个被公司开除了的员工。
Session的特定方法能使对象从一个状态转换到另一个状态。
二、对象的状态转换图
三、session的get()和load()方法
get():立即检索,当检索OID不存在的对象时会返回null。
load():延迟检索,当检索OID不存在的对象时会会返回ObjectNotFoundException(因为这是通过javassist要生成代理对象)
load()方法可能会抛出LazyInitializationException异常:在需要初始化代理对象之前已经关闭了session