持久化类类三种状态介绍



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

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

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



持久化类三种状态切换

Hibernate持久化对象三种状态_hibernate



  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();
}
}