Hibernate--持久化类的三种状态及其相互转换

一、持久化类的三种状态

Hibernate是持久层框架,通过持久化类完成ORM操作。Hibernate为了更好的管理持久化类,将持久化类分为三种状态。

  1. 瞬时态
    这种对象没有唯一的标识OID,没有被session管理,称为是瞬时态对象。

  2. 持久态
    这种对象有唯一标识OID,被session管理,称为是持久态对象。
    持久化类的持久态对象,可以自动更新数据库。

  3. 脱管态
    这种对象有唯一标识OID,没有被session管理,称为脱管态对象。

  4. 举个例子
    在下面这个代码块中,我们就可以看到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. 瞬时态对象
  1. 获得瞬时态对象–new()一个新的对象
    Customer customer = new Customer();

  2. 状态转换
    A. 瞬时态-----持久态:
    save(Object obj)、saveOrUpdate(Object obj)
    B. 瞬时态-----脱管态【设置一个id】
    customer.setCust_id(1);

3. 持久化对象
  1. 获得持久化状态
    get()、load()、find()、iterate()
    Customer customer = session.get(Customer.class,1);
  2. 状态转化
    A. 持久态-----瞬时态
    delete()
    B. 持久态-----脱管态
    close()、clear()
4. 脱管态对象
  1. 获得脱管态对象
    Customer customer = new Customer(); customer.setCust_id(1);
  2. 状态转化
    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底层的一级缓存

发布了32 篇原创文章 · 获赞 3 · 访问量 1341

猜你喜欢

转载自blog.csdn.net/weixin_44270855/article/details/104589808