zoukankan      html  css  js  c++  java
  • day35-hibernate映射 04-Hibernate的一级缓存:一级缓存的存在

    数据源:文件和数据库。从内存中获取,不用去数据库发送SQL语句查询了。缓存技术是hibernate的一个优化的手段。Session结束了,一级缓存就没了,就销毁了。SeesionFactory没了,二级缓存就没了,就销毁了。通常它是可以在多个session中共享数据的。一级缓存是自带的,不可卸载的。默认二级缓存是不开启,二级缓存不是自带的,可以卸载的,要使用它还要经过一系列的配置才可以使用。默认开启的是一级缓存。


    这些Java集合构成了一级缓存。一级缓存是Session中那一系列的集合,而且Session没结束,一级缓存就存在。Session结束了,一级缓存就没有了。session.save()往一级缓存放一份数据,get()和load()方法不会再去发SQL查询数据库。


    package cn.itcast.hibernate3.demo1;
    
    import static org.junit.Assert.*;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.utils.HibernateUtils;
    
    /**
     * Hibernate的测试类
     * 
     * @author zhongzh
     *
     */
    
    
    
    public class HIbernateTest1 {
        @Test
        //证明一级缓存的存在
        public void demo3(){
             //1.创建Session
              Session session = HibernateUtils.openSession();
            //2.开启事务
              Transaction tx = session.beginTransaction();
        
              //save方法可以向一级缓存中存放数据的.
    /*          Book book = new Book();
              book.setName("JQuery开发");
              book.setAuthor("张XX");
              book.setPrice(45d);
      
             
            Integer id = (Integer)session.save(book);
            Book book2 = (Book)session.get(Book.class,id);//get一执行,马上会发一条SQL语句去执行
            //但是现在不会了,因为它可以从一级缓存中获取数据
            */
              
            //分别用get执行两次查询.如果使用JDBC的话,执行两次查询它就发两次SQL语句
            Book book1 = (Book)session.get(Book.class,1);//马上发SQL去查询  get()它可以使用一级缓存的数据 而你在第一次使用get()的时候它可以向一级缓存存放数据
            System.out.println(book1);
            Book book2 = (Book)session.get(Book.class,1);//不发SQL,因为使用一级缓存的数据
            System.out.println(book2);
            System.out.println(book2);
            //3.提交事务
              tx.commit();
             //4.关闭资源
              session.close();
            
            
        }
        @Test
        //测试持久态的对象自动更新数据库(因为它依赖了hibernate的一级缓存区域)
        public void demo2() {
        //1.创建Session
          Session session = HibernateUtils.openSession();
        //2.开启事务
          Transaction tx = session.beginTransaction();
          
          //获得一个持久态的对象
         Book book = (Book) session.get(Book.class, 1);
         book.setName("Struts2开发3");//现在不用update(book)也可以自动完成数据库的更新
         //没有手动调用update()方法也可以完成数据库的更新
            
         //session.update(book);//之前是update(book)才能完成修改
          
        //3.提交事务
          tx.commit();
         //4.关闭资源
          session.close();
        }
        @Test
        //区分持久化对象的三种状态:
        public void demo1() {
            //  1.创建Session
            Session session = HibernateUtils.openSession();
            //  2.开启事务
            Transaction tx = session.beginTransaction();
            
            //往数据库去保存一本图书:
            Book book = new Book();//book是一个持久化对象,因为book有一个实体类已经
            //和我们的表建立起映射了 Book是一个持久化类  一new()就是瞬时态了  
            //瞬时态: 没有唯一标识OID,没有与session关联.
            //刚new()出来,从数据库里面也不知道它是什么。它根本就没有OID,没有和session关联,是一个单独的
            //对象
            book.setName("Hibernate开发");
            book.setAuthor("孙XX");
            book.setPrice(65d);
            
            session.save(book);  //持久态  往数据库一存它就有OID了,而且是和session关联。
            //持久态: 有唯一标识OID,与session关联.
            
            //  3.事务提交
            tx.commit();
            //4.释放资源
            session.close();
            
            book.setName("Struts2开发");  //脱管态  session关闭了,book不与session关联了。
            //脱管态:有唯一的标识,没有与session关联.
            fail("Not yet implemented");
        }
    
    }
    //******自动更新数据库的能力依赖了Hibernate的一级缓存.
  • 相关阅读:
    android 中管理短信
    Note: log switch off, only log_main and log_events will have logs!
    Android中内容观察者的使用---- ContentObserver类详解 (转)
    Mac下eclipse安装SVN插件
    手把手教你在Eclipse中使用CVS Branch功能
    DIV+CSS命名规范-转载2
    DIV+CSS命名规范-转载1
    仓库入仓-手机条码扫描
    速卖通承认的承运商代码
    同一个仓库,供应商和分销商的库存同时存在的问题
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6673111.html
Copyright © 2011-2022 走看看