总结了一下hibernate中list()与iterate()、get()与load()区别,直奔主题,如下。
- list():第一次查询时会发出一条SQL语句查出所有对象,并将数据放到缓存中,第二次查询时仍会到数据库中查询,返回的是list对象。(不使用一级缓存、但使用二级缓存)
- iterate():首先通过一条SQL语句查出所有满足条件记录的主键,根据主键去缓存中查询数据,如果缓存中不存在与之匹配的数据,则会根据主键发出相应的sql语句(1+N问题),返回的是iterator对象。
- -
- get():首先会查询一级缓存(session)、没有则查询二级缓存(sessionFactory)、最后查询数据库,如果数据库中没有对应记录则返回null。
- load():首先查询一级缓存(session),没有就创建代理延迟加载该对象,当需要使用该对象的时候查询二级缓存(sessionFactory)、数据库,如果数据库中不存在该条记录则抛出异常。因为load()方法认为该条记录在数据库中一定存在。
以上情况默认打开hibernate的二级缓存:
- 配置hibernate.cfg.xml文件
- 查询之前调用query.setCacheable(true)方法