一、持久化类的三种状态
Hibernate是持久层框架,通过持久化类完成ORM操作。Hibernate为了更好的管理持久化类,将持久化类分为三种状态。
-
瞬时态
这种对象没有唯一的标识OID,没有被session管理,称为是瞬时态对象。 -
持久态
这种对象有唯一标识OID,被session管理,称为是持久态对象。
持久化类的持久态对象,可以自动更新数据库。
-
脱管态
这种对象有唯一标识OID,没有被session管理,称为脱管态对象。 -
举个例子
在下面这个代码块中,我们就可以看到Customer对象的三种状态。
public class HibernateDemo2 {
@Test
//三种时态的区分
public void Demo1() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer(); //瞬时态对象:没有唯一标识OID,没有被session管理
customer.setCust_name("王小东");
Serializable id = session.save(customer); //持久态对象:有唯一标识OID,被session管理
tx.commit();
session.close();
System.out.println("客户名称:"+customer.getCust_name()); //脱管态对象:有唯一标识OID,没有被session管理
}
}
二、持久化类的状态转化
1. 持久化对象的状态演化图
Transient:瞬时态
Persistent:持久态
Detached:脱管态
2. 瞬时态对象
-
获得瞬时态对象–new()一个新的对象
Customer customer = new Customer();
-
状态转换
A. 瞬时态-----持久态:
save(Object obj)、saveOrUpdate(Object obj)
B. 瞬时态-----脱管态【设置一个id】
customer.setCust_id(1);
3. 持久化对象
- 获得持久化状态
get()、load()、find()、iterate()
Customer customer = session.get(Customer.class,1);
- 状态转化
A. 持久态-----瞬时态
delete()
B. 持久态-----脱管态
close()、clear()
4. 脱管态对象
- 获得脱管态对象
Customer customer = new Customer(); customer.setCust_id(1);
- 状态转化
A. 脱管态-----持久态
update()、saveOrUpdate()
B. 脱管态-----瞬时态
customer.setCust_id(null);
通过学习状态转化之后,我们可以深入理解saveOrUpdate(Object obj)这个方法:
当对象为瞬时态对象时,相当于save()操作;
当对象为持久态对象时,相当于update()操作。
三、持久态对象特性
持久化类的持久态对象会自动更新数据库!!!!!
public class HibernateDemo2 {
@Test
//持久化对象自动更新数据库
public void Demo2() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//获得持久态对象
Customer customer = session.get(Customer.class,1l);
customer.setCust_name("王小西");
//session.update(customer); 之前的做法
tx.commit();
session.close();
}
}
在之前,我们会调用session.update(customer);
将修改后的数据保存到数据库;但其实,因持久态对象具有自动更新数据库的特性,即使不调用这条语句,也可将数据保存到数据库。
如果数据库中的 cust_name 为“王小西”,则不会执行update()语句。
持久态对象为什么这么“智能”?这是因为它依赖了Hibernate底层的一级缓存
。