hibernate的三种状态

hibernate的三种状态

实体类(持久化类)对象是有状态的。

  • 为什么实体类对象会有状态?
  • 答:由于HIbernate框架是一个先映射,后操作的框架。所谓的状态就是实体类的对象和数据库是否有关联的情况。

hibernate的三种状态_第1张图片

Hibernate的持久化类有三种状态:

  1. 瞬时态(自由态):与数据库的表没有任何关联关系的实体对象。

    • 不存在持久化标识OID(相当于主键),尚未与Hibernate Session关联
  2. 持久态:正在与数据库保持连接的关系。

    • 存在持久化标识OID,加入到了Session的缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录
    • 特点:持久化状态对象的任何改变都会自动同步到数据库中
  3. 游离态(托管状态):曾经被session操作过,但session失效了。关闭,清除
    • 存在持久化标识OID,并且仍然和数据库中的数据存在关联,只是失去了当前和Session的关联

持久化标识OID指的是要和数据库的OID相对应

@Test
public void save(){
    //1.获得操作对象
    Session session = HibernateUtils.getSession();
    //2.打开事务,操作都需要打开事务(增删改)
    Transaction transaction = session.beginTransaction();
    //3.操作
    Customer c=new Customer();//瞬时态
    c.setCustName("百度");
    session.save(c);//持久态

    //4.提交事务
    transaction.commit();
    //这个时候c,被session操作过了。就和数据库建立关系。
    //5.关闭操作类对象session
    session.close();//游离状态
}

持久化状态对象的任何改变都会自动同步到数据库中

@Test
public void get(){
    //1.获得操作对象
    Session session = HibernateUtils.getSession();
    //通过OID获得对应的记录
    Customer customer = session.get(Customer.class,2L);
    customer.setCustName="Hello";//因为是持久化状态对象,所以修改的时候会同步

    session.close();
    //虽然customer是通过session获得的,但session关闭了,游离态
    System.out.println(customer.getCustName());
}

你可能感兴趣的:(hibernate)