看到一般都说,get方法不会查二级缓存,而load会查二级缓存,我配置了二级缓存,请看下面的代码 SessionFactory factory = HibernateUtils.getSessionFactory();
Session session=factory.openSession();
Lesson lesson = (Lesson)session.get(Lesson.class, 1);
System.out.println("第1次查询 ");
session.close();
Session session2=factory.openSession();
Lesson lesson2 = (Lesson)session2.get(Lesson.class, 1);
System.out.println("第2次查询:"+lesson2.getName());运行结果如下:
Hibernate: select lesson0_.ID as ID2_0_, lesson0_.NAME as NAME2_0_ from lesson lesson0_ where lesson0_.ID=?
第1次查询 
第2次查询:java
程序仅查询了一次数据库,我觉得第二次查询用的就是二级缓存。
如果我把二级缓存去掉,就会查询两次。
请高手解答下 get方法到底会不会查二级缓存呢?

解决方案 »

  1.   

    从你实际执行的结果来看应该是会用缓存的,初略的看了下get和load的区别在于get会判断类是否支持代理策略,其他的两个都是一样的
    1. see if its already loaded
     2. see if its cached
     3. actually go to the database
      

  2.   

    看来,get和load,仅存在能否使用代理延迟加载,以及 当数据库没有查到相关记录时,get返回null,而load是抛异常这两个区别了。大家 平时用get的时候,有没有注意会查二级缓存吗?
      

  3.   

    纠正下我说的,仔细看了下源码两者就一个区别,get返回null,而load是抛异常,代理两者都有使用的,查询数据都是先一级,二级,然后数据库
    源代码只有一点差异 public Object load(Class clazz, Serializable id) throws HibernateException {
    if (id==null) throw new NullPointerException("null is not a valid identifier");
    Object result = doLoadByClass(clazz, id, true, true);
    ObjectNotFoundException.throwIfNull(result, id, clazz);
    return result;
    }

    public Object get(Class clazz, Serializable id) throws HibernateException {
    if (id==null) throw new NullPointerException("null is not a valid identifier");
    return doLoadByClass(clazz, id, true, false);
    }