一, 概述
- 临时状态: 刚用 new 语句创建对象, 还没有被持久化, 并且不处于 Session 缓存中. 处于临时状态的 java 对象被称为临时对象.
- 持久化状态: 已经被持久化, 并且加入到 Session 的缓存中. 处于持久化状态的 java 对象被成为持久化对象.
- 游离状态: 已经被持久化, 但不再处于 Session 的缓存中. 处于游离状态的 java 对象被成为游离对象.
临时对象的特征:
-OID 为 null
- 不处于 Session 的缓存中, 也可以说, 不被任何一个 Session 实例关联
- 在数据库中没有对应的记录
持久化对象的特征:
-OID 不为 null
- 位于一个 Session 实例的缓存中, 持久化对象总是被一个 Session 实例关联
- 持久化对象和数据库中的相关记录对应
- 会根据持久化对象的属性变化, 同步更新数据库.
- User user=(User)session.get(User.class,1);// 获取持久化对象 持久状态
- user.setName("jerry");
- transaction.commit();
我们发现我们没有执行 update 语句, 却打印了 update 语句. Hibernate 会自动将持久化对象的状态同步到数据库中.
游离对象的特征:
-OID 不为 null
- 不再位于 Session 的缓存中, 也可以说, 游离对象不被 Session 关联
- 数据库中有对应的记录
例子:
- // 对象状态转换的过程
- Transaction ts=session.beginTransaction();
- User user =new User(); // 临时状态
- user.setName("tom");
- user.setPassword("123456");
- session.save(user); // 转变为持久化状态
- ts.commit(); // 持久化状态
- session.close(); // 转变为游离状态
- sessionfactory.close();
- System.out.println(user.getName()); // 游离状态
二, 三种状态的转换
1) 临时状态转换持久化状态
-Session 的 save() 方法会将临时状态转换成持久状态.
把要保存的对象放入 Session 缓存中, 使它进入持久化状态. 使用映射文件指定的主键生成策略, 为持久化对象分配唯一 OID.
save 方法只是为对象分配 UID. 我们可以在 save 方法处打断点.
当我们的主键生成策略为 native 时, 由于我们使用 mysql 数据库, 主键自增, 所以执行完 save 方法后, 打印 insert 语句, mysql 数据库为我们对象自增 OID
当我们的主键生成策略为 incrementt 时, increment 是由 Hibernate 维护, 先去表中查最大 ID 然后 + 1, 我们执行完 save 方法之后, 发现打印 select 查找最大 id 的语句, 执行 commit 时才打印插入语句
2) 临时状态转换成游离状态
- 将临时状态的对象 OID 设置为数据库中对应的记录.
- User user=new User();
- user.setId(1);
3) 持久化状态转换成临时状态
第一种:
- User user=(User)session.get(User.class,1);// 获取持久化对象 持久状态
- session.close(); // 游离状态
- user.setId(null);// 临时状态
第二种:
- User user=(User)session.get(User.class,1);// 获取持久化对象 持久状态
- session.evict(user); // 游离状态, 此方法会将 session 缓存中清除持久化对象, 使其变为游离状态
- user.setId(null);// 临时状态
4) 持久化状态转换成游离状态
第一: 调用 session 的 close 方法, 持久化状态变为游离状态
第二: 调用 session 的 evict() 方法方法, 将持久状态转变为游离状态
5) 游离状态转换成临时状态
只需要将游离状态的对象 OID 变为 null.
6) 游离状态转换成持久状态
Session 的 update() 方法使游离状态转换成持久状态.
- User user=(User)session.get(User.class,1);// 获取持久化对象 持久状态
- session.evict(user); // 游离状态, 此方法会将 session 缓存中清除持久化对象, 使其变为游离状态
- session.update(user);
来源: http://www.bubuko.com/infodetail-2721486.html