This blog post(引用here)表示SQLQuery不使用Hibernate会话缓存。但是,a)没有证据,b)他们不使用SQLQuery.addEntity,这可能会提供允许Hibernate使用其缓存的信息。
The docs没有提到这种或那种方式的缓存。
如果我使用addEntity,SQLQuery是否会使用会话缓存?
修改:This section文档说:
每当您将对象传递给save(),update()或saveOrUpdate()时,和 每当使用load(),get(),list(),iterate()检索对象时 或者scroll(),该对象被添加到内部缓存中 会话。
由于addEntity()允许list()返回对象,这意味着它正在使用缓存。我怎么检查?那些相同的文档说缓存有一个“包含”方法,可以浏览二级缓存,但不能浏览会话缓存。
编辑#2 :通过启用Hibernate查询的日志记录,它似乎不是缓存,但也许某些情况会使其缓存。
答案 0 :(得分:2)
我不认为beny23的答案是正确的。我相信setCacheable
指的是第二级缓存而非会话缓存。
要检查实体是否在会话缓存中,您可以使用Session.contains()
。您还可以进行快速测试:获取实体,修改它,关闭会话并查看mod是否在数据库中。
答案 1 :(得分:0)
根据SQLQuery的javadoc,它扩展了Query
接口,它提供了setCacheable方法(默认为false),因此您应该能够执行以下操作: / p>
Query query = session.createSQLQuery(
"select * from my_table e")
.addEntity(MyEntityClass.class)
.setCacheable(true);
此外,您可能希望通过使用来设置缓存区域 setCacheMode和setCacheRegion方法。