Web开发 | Hibernate - 07.Hibernate持久化对象的状态

1. 持久化对象的状态

1、Hibernate 的持久化类

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

2、Hibernate 的持久化类的状态

  Hibernate 为了管理持久化类,将持久化类分成了三个状态
    1)瞬时态:Transient Object
    2)持久态:Persistent Object
    3)脱管态:Detached Object(游离态)

Hibernate 的持久化类的状态
Hibernate 的持久化类的状态


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项目,删除多余类、文件,并修改映射文件)
新建项目

  /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管理


持久化对象自动更新数据

  /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()

运行效果


3. Hibernate持久化对象的三种状态的区别总结

  对于三者:在 session 中存在的,就是持久化对象,不存在的就是瞬时或脱管对象。

  对于瞬时和脱管对象:有 OID(持久化标识)的就是脱管对象,没有的就是瞬时对象。

  OID 一定是与数据库主键一一对应的

是否有持久化标识(OID) session 是否存在 数据库中是否有
瞬时态对象
– 临时状态
没有 没有 没有
持久态对象 (提交后:有) / (提交前:没有)
脱管态对象
– 游离
没有
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值