Hibernate实体对象声明周期
- 实体对象的4中状态
1.文字表达
Transient(临时状态/瞬时状态):刚刚被new关键字创建,还没有被持久化,不在Session的缓存中。
不受session管理,在数据库中没有记录
Persistent(持久化状态):已被持久化,并加入到Session缓存中。
受session管理,在数据库中存在与之相对应的记录,处于持久化状态的对象会影响(改变)数据库中的内容
Detached(游离状态):已被持久化,但不再处于Session缓存中。
不受session管理,但是数据库中有与之相对应的记录
Removed(删除状态):Session已经计划将其从数据库删除,并且不在处于Session缓存中。
不受session管理,数据库中也没有与之相对应的记录
2.图像展示
3.各个状态对象的特点
3-1临时对象(Transient Objects)
处于临时状态的对象称为临时对象
在数据库中不存在与之相对应的记录
3-2持久化对选哪个(Persist Objects)
处于持久化状态的对象称为持久化对象
在数据库中存在于相对应的记录
3-3游离对象(Detached Objects)
处在游离状态的对象称为游离对象
在数据库中可能存在与之相对应的记录(前提是没有其他Session实例删除该记录)
3-4删除状态(Removed Objects)
处在删除状态的对象称为被删除对象
数据库中存在与之对应的记录(已经计划从数据库中删除)
4.Session中的方法
4-1.session中的save()方法
1.把对象加入缓存中,使其变成持久化对象;
2.根据映射文件配置的标识符生成器为对象分配一个 OID;
3.计划执行一个 insert,把对象当前属性值组装到 insert 语句中;
4. 事务提交后(transaction.commit())永久的将数据保存到数据库。
4-2.session中的update()方法
1.把游离对象重新加入 Session 缓存中,使其变为持久化对象;
2. 计划执行一个 update,将对象当前属性组装到 update 语句,执行 update 语句;
3. 事务提交后(transaction.commit())永久的将数据保存到数据库;
4. 不管对象属性有没有改变都会执行update 。
4-3.session中的delete()方法
1. 检查传入的参数是否是持久化对象,如果是持久化对象将其移出 Session 缓存;
2.计划执行一个 delete,但是并不立即执行;
3. 当 Session 清理缓存时才执行 delete,比如执行 Session.flush()。(清理代表的是同步,和数据库中的同步)
4-4.Session的load()和get()方法
load() 与 get() 方法都是根据 OID 加载持久化对象。
load() 与 get() 方法的不同点:
如果数据库中不存在与 OID 对应的记录:
load() 会抛出 ObjectNotFoundException 异常;
get() 会返回 null。
默认加载策略:
load() 使用类的延迟加载策略;
get() 使用类的立即加载策略。