zoukankan      html  css  js  c++  java
  • Hibernate持久化对象的状态

    1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 .

    2. 暂时状态(Transient :
        1. 在使用代理主键的情况下 , OID 通常为 null
        2. 不处于 Session 的缓存中
        3. 在数据库中没有相应的记录

    3. 持久化状态(也叫”托管” ) Persist

        1. OID 不为 null
        2. 位于 Session 缓存中
        3. 若在数据库中已经有和其相应的记录 , 持久化对象和数据库中的相关记录相应
        4. Session  flush 缓存时 , 会依据持久化对象的属性变化 , 来同步更新数据库
        5. 在同一个 Session 实例的缓存中 , 数据库表中的每条记录仅仅相应唯一的持久化对象( Session 缓存对象的 OID 不能反复)

        @Test
        public void testOID(){
            News news2 = (News ) session.get (News.class , 1);
            System.out.println (news2 );
        
            News news = new News ();
            news.setAuthor ("Oracle2" );
            news.setContent ("Oracle DB" );
            news.setDate (new Date ());
            news.setTitle ("DB" );
            news.setId (1 );
        
             //抛出异常: org.hibernate.NonUniqueObjectException
            session.update (news );
        }

    4. 游离状态(也叫”脱管” ) Detached ):
        1. OID 不为 null
        2. 不再处于 Session 缓存中
        3. 普通情况需下 , 游离对象是由持久化对象转变过来的 , 因此在数据库中可能还存在与它相应的记录

    5. 删除状态(Removed)
        1. 在数据库中没有和其 OID 相应的记录
        2. 不再处于 Session 缓存中
        3. 普通情况下 , 应用程序不该再使用被删除的对象

    6. 状态的转换图

    7. get & load 的差别:
        共同点:
        getload 从数据表中载入一个对象 , 载入后即为持久化状态的对象
        不同点:
        get: 马上查询数据表. 若没有相应的记录 , 返回 null 
        load: 延迟查询数据表 . 直到第一次使用该对象时 , 再进行查询,
        先返回的是一个代理对象 . 若没有相应的记录 ,而且使用了该对象 , 则会抛出org.hibernate.ObjectNotFoundException 异常


    8. update 方法:

        @Test
        public void testUpdate(){
            News news = (News ) session.get (News.class , 1);
            System.out.println (news );
        
            transaction.commit ();
            session.clear ();
        
            session = sessionFactory.openSession ();
            transaction = session.beginTransaction ();
        
             //此时对象为游离状态
            news.setAuthor ("Oracle" );
        
             //update 能够使游离对象变为持久化对象 .
             //通常须要发送一条 UPDATE 语句
             //若对象即为持久化对象 , 则不须要调用 update() 方法
            session.update (news );
        }

    注意:
    1 . 使用场景: BS 项目中从页面传过来一个对象,须要对其进行更新时,即调用 update()方法
    2 . 若数据表中没有对象相应的记录,还要运行 update() 方法,则会抛出异常: org.hibernate.StaleObjectStateException

    9. saveOrUpdate (): 保存或更新

    11. delete ():删除一个对象相应的记录。
        1. 若仅仅想删除指定的对象,设置 ID 就可以。

        2. 若数据表中没有相应的记录。则抛出异常: java.lang.IllegalArgumentException

    12. Hibernate 调用原生的 JDBC API

        session.doWork(new Work() {
            @Override
            public void execute(Connection connection ) throws SQLException {
                 //使用 JDBC 原生的 API
             }
        });


  • 相关阅读:
    团队项目第二阶段——第一天
    团队项目第一阶段绩效评估
    铁大树洞与市面上现有APP对比
    第一阶段其他组评价汇总
    第一阶段对其他组的评价
    铁大树洞app功能演示和使用说明
    团队冲刺——第十天
    团队冲刺——第九天
    团队冲刺——第八天
    梦断代码读后感04--毁灭即拯救
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7293830.html
Copyright © 2011-2022 走看看