Hibernate框架(11) —— Hibernate中的对象状态

一、引言

    Hibernate中对象有三种状态:瞬时态、持久化态、脱管态。

二、瞬时状态              

   1. 特点:

        A  没OID,不在session管理范围内。

        B  也称自由态或临时态,一般指我们new出来的对象,不存在OID,与Hibernate无关联,在数据库中无记录。

        C  使用后,会被JVM直接回收,只是用于信息携带。

   2. 瞬时态 ——> 持久态:

        save() 不应该理解为保存,而应该理解为将瞬时态转换成持久态的方法。

        主键自增:执行save方法时,为了将对象转换为持久化态,必须生成id值。所以需要执行insert语句生成。

        saveOrUpdate() 无脑将对象状态转换为持久化状态

   3. 瞬时态 ——> 脱管态:

        可手动设置OID,但不建议这样做:

        Demo:

           public class HibernateTest {

               @Test

               public void test() {

                   Session session = HibernateUtils.openSession();

                   session.beginTransaction();

                   Customer c = new Customer();

                   c.setName(“张三”);

                   c.setSex(“男”);

                   c.setId(7); // 瞬时 ——> 脱管

                }

            }

三、持久化态               

    1. 特点

        A  有OID,由session管理

        B  在事务未提交之前一直是持久态,当它发生改变时,Hibernate可以检测到,在数据库中可能有,也可能没有。

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

    2. 持久态 ——> 瞬时态

        delete()

        操作后相当于数据库里面就没有该记录了,被删除后的持久化对象不再建议使用。

    3. 持久态 ——> 脱管态

        session本身有缓存,就是一级缓存

        A  evict:清除一级缓存中指定的一个对象

        B  clear:清空一级缓存

        C  关闭,即清空一级缓存 

     4. Demo       

        public void test() {

            1.获得session

            Session session =HibernateUtils.openSession();

            2.控制事务

            Transaction tx = session.beginTransaction();

            3.执行操作

            Customer c = session.get(Customer.class, 1L);持久化对象,session管理,有id

            c.setCust_name("小红帽");

            4.提交事务,关闭资源

            tx.commit();

            session.close(); 托管态,有id,不在session管理范围内

        }

      

四、脱管态                   

    1. 特点

        A  有OID,不在session管理范围内

        B  也叫游离态或离线态,它是指持久态对象失去了与Session的关联,脱管态对象存在OID。

        在数据库中有可能存在,也有可能不存在。

        D  发生改变时Hibernet不能检测到。

    2. 脱管态 ——> 瞬时态

       直接将OID删除(不建议这样做,我们不建议操作脱管态的对象)。

       public class HibernateTest {

           @Test

           public void test() {

               Session session = HibernateUtils.openSession();

               session.beginTransaction();

               Customer c = new Customer();

               c.setName(“张三”);

               c.setSex(“男”);

               c.setId(7); //瞬时态 ——> 脱管态

               c.setId(null); //脱管态 ——> 瞬时态

           }

       }

五、查看三种状态

    public void test() {

        1.获得session

        Session session =HibernateUtils.openSession();

        2.控制事务

        Transaction tx = session.beginTransaction();

        3.执行操作

        Customer c = new Customer();  瞬时态 没有id,没有与session关联

        c.setCust_name(“小红”); 瞬时态

        session.save(c); 持久化态,有id,关联session

        4.提交事务,关闭资源

        tx.commit();

        session.close(); 托管态,有id,没有关联session

    }

六、从对象三种状态来理解增删改查的本质

Hibernate框架(11) —— Hibernate中的对象状态_第1张图片

 

将我们希望同步到数据库的数据,对应的对象转换为持久化状态。

saveOrUpdate()方法:无脑将对象状态转换为持久化状态。

你可能感兴趣的:(Hibernate框架)