Hibernate的学习之路十(持久化对象的三个状态)

本文深入讲解Hibernate中持久化对象的三种状态:瞬时态、持久态及脱管态,并通过实例代码展示了各状态间的转换过程及其特点,如持久态对象具备的自动更新数据库能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们在对数据库进行操作的时候,都会创建JavaBean的对象,这篇主要说明了这个对象的三种状态。

分析


持久化对象的状态

1. Hibernate的持久化类
    * 持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.
        * 持久化类 = Java类 + hbm的配置文件

2. Hibernate的持久化类的状态
    * Hibernate为了管理持久化类:将持久化类分成了三个状态
        * 瞬时态:Transient  Object
            * 没有持久化标识OID, 没有被纳入到Session对象的管理.

        * 持久态:Persistent Object
            * 有持久化标识OID,已经被纳入到Session对象的管理.

        * 脱管态:Detached Object
            * 有持久化标识OID,没有被纳入到Session对象的管理.

以下是编写的代码demo,可以加深理解


	/**
	 * 演示持久类的对象的三个状态
	 */
	@Test
	public void run3(){
		// 获取session
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		
		// 持久User的对象
		// 瞬时态:没有OID的值,没有被session管理,此时user对象是瞬时态对象
		User user = new User();
		user.setName("小泽老师");
		user.setAge(48);
		
		// 使用session保存用户
		// user对象中已经存在id的值,默认的情况下,把user对象也保存到session的缓存中
		Serializable id = session.save(user);
		System.out.println("主键的值:"+id);
		// user是持久态对象
		
		tr.commit();
		// session销毁,缓存没有了
		session.close();
		// 打印
		// user对象存在id值,session销毁了,缓存不存在,session管理user对象?不管理
		// user是托管态的对象
		System.out.println(user.getId());
		System.out.println(user.getName());
	}


Hibernate持久化对象的状态的转换

1. 瞬时态  -- 没有持久化标识OID, 没有被纳入到Session对象的管理
    * 获得瞬时态的对象
        * User user = new User()
    * 瞬时态对象转换持久态
        * save()/saveOrUpdate();
    * 瞬时态对象转换成脱管态
        * user.setId(1)

2. 持久态  -- 有持久化标识OID,已经被纳入到Session对象的管理
    * 获得持久态的对象
        * get()/load();
    * 持久态转换成瞬时态对象
        * delete();  --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
    * 持久态对象转成脱管态对象
        * session的close()/evict()/clear();

3. 脱管态  -- 有持久化标识OID,没有被纳入到Session对象的管理
    * 获得托管态对象:不建议直接获得脱管态的对象.
        * User user = new User();
        * user.setId(1);
    * 脱管态对象转换成持久态对象
        * update();/saveOrUpdate()/lock();
    * 脱管态对象转换成瞬时态对象
        * user.setId(null);

4. 注意:持久态对象有自动更新数据库的能力!!!



自动更新数据库能力


Hibernate还有一个重要的特性九是可以自动更新数据库的能力,是靠session这个一级缓存来实现的。就算不使用update()这个方法也可以修改数据,代码如下:


/**
	 * 持久态的对象有自动更新数据库的能力
	 * session的一级缓存!!
	 */
	@Test
	public void run1(){
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		
		// 获取到持久态的对象
		User user = session.get(User.class,1);
		// user是持久态,有自动更新数据库的能力
		System.out.println(user.getName());
		
		// 重新设置新的名称
		user.setName("隔离老王");
		
		// 正常编写代码
		// session.update(user);
		
		tr.commit();
		session.close();
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值