导航

Hibernate 对象的三种状态

Posted on 2017-10-09 09:40  耍流氓的兔兔  阅读(155)  评论(0编辑  收藏  举报

 

Hibernate中性能优化涉及的知识点:

  对象的三种状态

  一级缓存和快照

  延迟加载策略

  抓取策略

  整合c3p0连接池

  二级缓存

Hibernate中对象的三种状态:

    临时态(Transient):

    没有被session管理,没有OID

    瞬时态对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)

    如果瞬时态对象在程序中没有被引用,会被gc销毁

    又称瞬时态

  持久态(Persistent)

    被session管理,有OID

    处于持久态的对象也成为PO(Persistent Object),PO可以直接影响到数据库的数据

    在数据库中有对应的记录,并拥有持久化标识

    Hibernate会检测PO的任何改动,在当前操作单元执行完毕后将对象数据与数据库同步,不需要手动执行update

  游离态(Detached):

    没有被session管理,有OID

    与PO关联的session被关闭后,对象就变成游离态

    对游离态对象的引用依然有效,对象可以被继续修改

    游离态对象如果重新被关联到某个session上,会再次变为PO

    又称脱管态

  参考链接:

    http://blog.csdn.net/redarmy_chen/article/details/7069482

    http://blog.csdn.net/mr_linjw/article/details/45249363 

  Test:

        //临时态:没有被session管理,没有OID
        Customer c = new Customer();
        c.setName("draco");
        System.out.println("OID1:"+c.getId());
        
        //持久态:被session管理,有OID
        session.save(c);
        System.out.println("OID2:"+c.getId());
        
        //游离态:没有被session管理,有OID
        tx.commit();
        session.close();
        System.out.println("OID3:"+c.getId());

  Console:

OID1:null
Hibernate: 
    insert 
    into
        t_customer
        (c_name, c_gender, c_age, c_level) 
    values
        (?, ?, ?, ?)
OID2:16
OID3:16

Hibernat对象三种状态的生命周期: