日期:2014-05-20  浏览次数:20821 次

hibernate的session.get()方法到底会不会查二级缓存?
看到一般都说,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方法到底会不会查二级缓存呢?

------解决方案--------------------
纠正下我说的,仔细看了下源码两者就一个区别,get返回null,而load是抛异常,代理两者都有使用的,查询数据都是先一级,二级,然后数据库
源代码只有一点差异
Java code

    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);
    }