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的一级缓存.
原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6673111.html