Hibernate中的SQLQuery是否使用会话缓存?

时间:2012-08-23 20:34:26

标签: hibernate caching

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查询的日志记录,它似乎不是缓存,但也许某些情况会使其缓存。

2 个答案:

答案 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);

此外,您可能希望通过使用来设置缓存区域 setCacheModesetCacheRegion方法。