zoukankan      html  css  js  c++  java
  • hibernate 一级缓存(Session缓存)和持久化对象的四种状态

    1:持久化对象的四种状态

      四种状态分别为临时状态、持久化状态、游离状态和删除状态。

      这几种状态可以相互转换

      状态转换图:

      

      代码演示:

      

     // 开启事务  
      Transaction transaction = session.beginTransaction();   
      Book book = new Book(); // 瞬时态(没有OID,未与Session关联)  
      book.setName("hibernate精通");  
      book.setPrice(56d);    
      session.save(book);// 持久态(具有OID,与Session关联)  
      // 提交事务,关闭Session  
      transaction.commit();  
      session.close();    
      System.out.println(book.getId()); // 脱管态(具有 OID,与Session断开关联) 

    持久化对象之间转变

        1.瞬态对象——通过new关键字获取

          瞬时——持久:save、saveOrUpdate(都是通过session获得)

          瞬时——脱管:对象.setID(1);为瞬时对象设置新的OID

        2.持久化对象——通过get/load、Query查询获得

          持久——瞬时:delete(被删除持久化对象,不建议再次使用)

          持久——脱管:evict(清楚一级缓存中某个对象)、close(关闭Session,清除一级缓存)、clear(清楚一级缓存所有对象)

        3.脱管对象:无法直接获得

          脱管——瞬时:对象.setID(null);删除对象OID

          脱管——持久:update、saveOrUpdate、lock

        4.删除状态  :无法直接获得

          持久——删除:对象.delete();

          游离——删除: 对象.delete();

    2:一级缓存

      也成为session缓存,它和session生命周期相同,周期比较短,属于事务隔离级别。

      hibernate的缓存是通过集合实现的,hibernate中封装了list和map的集合。hibernate向一级缓存中存放数据时,同时保存快照数据,当执行flush()时,会对比一级缓存中的数据和快照中的数据是否一致,如果不一致,则执行更新。

      用处:

        当要查询的数据在缓存中已经存在时,hibernate将不会再向数据库发送查询语句,而是直接从缓存中获取对象。

        session.get()、load(支持一级缓存。createQuery()不支持一级缓存,即即使是两次相同的查询,获得list也是相同的,也会向数据库发起2次查询

      操作:

        1:flush()

          将缓存同步到数据库,首先会将缓存数据和快照区数据进行对比,如果相同,就不会发送update()语句,如果不同,则执行update()语句,所以不一定会很发生update()语句到数据库。     

            session.beginTransaction();  
      
            // 通过ID从数据库中获取值,此时会产生快照  
            Book book1 = (Book) session.get(Book.class, 1);  
            // 修改属性值  
            book1.setName("xxx");  
            // 手动flush,刷新缓存到数据库,此时只是生成SQL语句,但是数据库中并没有发生变化,只有commit后,数据库才会发生相应的变化。  
            session.flush();  
            // 手动提交事务  
            session.getTransaction().commit();  
            // 关闭session的资源  
            session.close();         

       2:refresh()

          将数据库中的数据同步到缓存中,这个过程一定会产生更新语句,同步一级缓存和快照

            session.beginTransaction();  
      
            // 从数据库中查询book,并放置到Session缓存中一份  
              
            Book book1 = (Book) session.get(Book.class, 1);   
            //修改缓存对象的值  
            book1.setName("xxx");   
      
            //又进行了一次查询操作,此时把快照中的数据与数据库一致  
            session.refresh(book1);  
      
            System.out.println(book1);  
      
            // 4.提交食物  
            session.getTransaction().commit();  
            // 5.关闭session资源 
            session.close();    

        3:clear()

         清除所有对象的一级缓存,对对象的所有操作,全部失效,回复到当初和快照一样

             // 启动事务操作  
            session.beginTransaction();  
      
            // session.setFlushMode(FlushMode.MANUAL);  
      
            // 通过ID从数据库中获取值,此时会产生快照  
            Book book1 = (Book) session.get(Book.class, 1);  
            // 修改属性值  
            book1.setName("xxx");  
            //清除一级缓存操作,此时当作事务提交的时候,数据库中并没有发生任何的变化  
            session.clear();  
            // 手动提交事务  
            session.getTransaction().commit();  
            // 关闭session的资源  
            session.close();      

        4:evict()

          对指定的对象清除一级缓存      

             session.beginTransaction();  
      
            //当执行一次操作后,会把对象放置到Session缓存中  
            Book book1 = (Book) session.get(Book.class, 1);  
            Book book2 = (Book) session.get(Book.class, 2);   
            session.evict(book2); // 从缓存中清除book2对象所做的修改  
            // 当再次执行操作时,book2还会发出SQL语句操作  
            Book book11 = (Book) session.get(Book.class, 1);   
            Book book22 = (Book) session.get(Book.class, 2);  
      
            // 手动提交事务  
            session.getTransaction().commit();  
            // 关闭资源  
            session.close();      

     

  • 相关阅读:
    根据字数自适应项目长度
    Flash与后台数据交互方法总结
    如何让你的网站排名靠前
    C#实现web信息自动抓取
    百度风云榜前50名小偷——专门用于提高你网站的流量!
    ASP资源:ASP编程网上游
    .Net下的HashTable
    强弹代码
    有用的sql语句
    Lotus Domino中使用Xpage技术打造通讯录
  • 原文地址:https://www.cnblogs.com/yuwenhui/p/7494076.html
Copyright © 2011-2022 走看看