zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Hibernate持久化对象三种状态

hibernate状态对象 三种 持久
2023-09-14 09:02:01 时间

持久化类类三种状态介绍

  1. 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。
    简单说:无OID 与数据库中的信息无关联,不在session管理范围内。

  2. 持久态:在hibernate session管理范围内,它具有持久化标识OID
    它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。
    简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。

  3. 托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。
    对于托管态对象,它发生改变时hibernet不能检测到。

持久化类三种状态切换

这里写图片描述

  1. 瞬时态(new 出来的)
    瞬时——>持久 save saveOrUpdate
    瞬时—–>脱管(游离) 手动设置oid

  2. .持久态 它是由session管理
    持久——->瞬时 delete() 被删除后持久化对象不在建议使用
    持久—–>脱管 注意:session它的缓存就是所说的一级缓存
    evict(清除一级缓存 中指定的一个对象)
    clear(清空一级缓存)
    close(关闭,清空一级缓存)

  3. .脱管态 (它是无法直接获取)
    脱管—–>瞬时 直接将oid删除
    脱管—–>持久 update saveOrUpdate lock(过时)

测试持久化对象的三种状态

// 测试持久化对象三种状态
@Test
public void test2() {
    // 1.得到session
    Session session = HibernateUtils.openSession();
    session.beginTransaction();

    Customer c = new Customer(); // 瞬时态 (无oid 与session无关联)
    c.setName("张三");
    c.setSex("男");

    session.save(c); // 建立了c与session关联关系,它就是持久态,(有oid)

    // 2.事务提供,关闭
    session.getTransaction().commit();
    session.close();

    System.out.println(c.getId()); // 断开了与session的关联,它是托管态(有oid)

}

HibernateUtils工具类

public class HibernateUtils {

    private static Configuration config;
    private static SessionFactory sessionFactory;

    static{

        config=new Configuration().configure();
        sessionFactory=config.buildSessionFactory();
    }

    public static Session openSession(){
        return sessionFactory.openSession();
    }
}