我在nhibernate.cfg.xml文件中设置了class-cache。
当我通过Id获取我的实体时,一旦加载了对象,我就看不到SQL请求。
但是当我使用条件获取实体时,总会有SQL查询......
修改
我想这回答了我的问题:
http://www.javalobby.org/java/forums/t48846.html
假设我们想要根据更复杂的内容查找条目 查询比直接通过ID,例如按名称。在这种情况下,Hibernate 必须仍然发出一个SQL语句来获取。的基本数据集 查询。所以,例如,这段代码:
查询query = session.createQuery(“来自Person as p where p.firstName =?“); query.setString(0,”John“); List l = query.list(); ...会调用一个选择(假设我们的关联是 高速缓存)。
select * from Person where firstName ='John'这个单选将会 然后返回'1',然后缓存将用于所有其他查找 因为我们已经缓存了所有内容。这个强制性单选是在哪里 查询缓存进来了。
答案 0 :(得分:2)
不确定您的“编辑”是否表示您已找到所有答案。 NHibernate将缓存机制分为两个区域。
如上所述,First是“类”缓存。可以使用具有特定ID(Session.Get(id);,引用的属性,集合)的对象的任何请求。
第二个是“查询”缓存。在这种情况下,用于缓存的键取决于传递的Criteria
。那些用于获取结果集(where,order by,top ...)。在这种情况下缓存的值是由该查询返回的一组ID。
所以稍后,当应用相同的标准时,将返回缓存的ID集,并重用来自类缓存(通过ID)的缓存实体。
(特定场景适用于投影,在最新的NHibernate版本中也可以缓存。在这种情况下,结果不包含具有唯一ID的实体,而是一组列。虽然不适合ID基于缓存,它也是有效的。版本3.3正在为我做这个)
所以,最后回答:
但是当我使用条件获取实体时,总会有SQL查询......
我们也必须允许查询缓存:
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
允许二级缓存,并且可以存储具有ID的对象。此外,还启用了对查询缓存的支持,因此同一条件组合的第二次调用根本不应该转到SQL服务器。
缓存查询示例:
criteria.SetCacheable(true)
.SetCacheMode(CacheMode.Normal)
.SetCacheRegion("LongTerm");