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