看到一般都说,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); }