1. 持久化对象的状态
1、Hibernate 的持久化类
持久化类:Java 类与数据库的某个表建立了映射关系,这个类就称为持久化类。
持久化类 = Java 类 + hbm 的配置文件
2、Hibernate 的持久化类的状态
Hibernate 为了管理持久化类,将持久化类分成了三个状态
1)瞬时态:Transient Object
2)持久态:Persistent Object
3)脱管态:Detached Object(游离态)
![Hibernate 的持久化类的状态](https://i-blog.csdnimg.cn/blog_migrate/ab49ce873f7c450b1d5198460c9272a1.png)
![Hibernate 的持久化类的状态](https://i-blog.csdnimg.cn/blog_migrate/700123e8d5c832a1b8ae382c5777531d.png)
2. Hibernate持久化对象的状态的转换
1、瞬时态 – 没有持久化标识 OID, 没有被纳入到 Session 对象的管理
- 获得瞬时态的对象
- User user = new User()
- 瞬时态对象转换持久态
- session.save()
2、持久态 – 有持久化标识 OID,已经被纳入到 Session 对象的管理
- 获得持久态的对象
- get()/load();
- 持久态转换成瞬时态对象
- delete(); — 比较有争议的,进入特殊的状态(删除态:Hibernate 中不建议使用的)
- 持久态对象转成脱管态对象
- session 的 close()/evict()/clear();
3、托管态 – 有持久化标识 OID,没有被纳入到 Session 对象的管理
4、持久态对象有自动更新数据库的能力
通过debug了解三个状态
新建项目(Hibernate5_d02_c02)
(借鉴Hibernate5_d02_c01项目,删除多余类、文件,并修改映射文件)
![新建项目](https://i-blog.csdnimg.cn/blog_migrate/e5ba619a63da79201a7e6b7399663197.jpeg)
/Hibernate5_d02_c02/src/hibernate/test/TestUser.java
程序代码如下:
package hibernate.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import hibernate.domain.User;
import hibernate.util.HibernateUtils;
public class TestUser {
/*
* 保存一条数据,查看3个状态
*/
@Test
public void testSave(){
//持久化状态转换
//1.获取 session
Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction();
//2.新建 User 对象
//瞬时态:
//特点:没有 OID,new 出来的一个对象,不与 session 关联,不受 session管理,数据库中没有对应的记录
User user = new User();
user.setName("小张");
user.setAge(18);
//3.保存对象
//在 save 执行之前,user 都只是瞬时态
//当 save 执行之后,user 就处于持久态
session.save(user);
//持久态
//特点:有 OID,数据库存在对应的记录,与 session 关联,受 session 管理
tr.commit();
//4.关闭session资源
//session关闭后,有OID,不受session管理,与数据库无关
session.close();
//只要 session 已关闭,那么就处于脱管态
//有 OID,数据库中存在对应的记录,但是不与 session 关联,不受 session管理
System.out.println(user);
}
}
设断点进行debug
瞬时态
持久态
有ID,不受session管理
![瞬时态](https://i-blog.csdnimg.cn/blog_migrate/efbb84a3eb3010209218a454c8476f28.png)
瞬时态
![持久态](https://i-blog.csdnimg.cn/blog_migrate/c396d15eafbe29c4228d009d6b5240f5.png)
持久态
![脱管态](https://i-blog.csdnimg.cn/blog_migrate/f6fdcdeda52bee3fa9a722a9bb13c8e7.png)
有ID,不受session管理
持久化对象自动更新数据
/Hibernate5_d02_c02/src/hibernate/test/TestUser.java
程序代码如下:
...
public class TestUser {
...
/*
* 持久化对象自动更新数据
*/
@Test
public void testUpdate(){
//1.获取 session
Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction();
//2.调用 get 方法,现在 user 是持久态
User user = session.get(User.class, 1);
//3.设置属性
user.setName("小刘");
//正常情况下调用修改方法
//session.update(user);
//4.把内存中修改的数据存入数据库,不用进行update操作
tr.commit();
//5.关闭资源
session.close();
}
}
运行测试单元testUpdate()
![运行效果](https://i-blog.csdnimg.cn/blog_migrate/2a37865c4d5d0fb859b2341fc27e2008.jpeg)
3. Hibernate持久化对象的三种状态的区别总结
对于三者:在 session 中存在的,就是持久化对象,不存在的就是瞬时或脱管对象。
对于瞬时和脱管对象:有 OID(持久化标识)的就是脱管对象,没有的就是瞬时对象。
OID 一定是与数据库主键一一对应的
是否有持久化标识(OID) | session 是否存在 | 数据库中是否有 | |
瞬时态对象 – 临时状态 | 没有 | 没有 | 没有 |
持久态对象 | 有 | 有 | (提交后:有) / (提交前:没有) |
脱管态对象 – 游离 | 有 | 没有 | 有 |