1

这篇博文(在此处引用)说 SQLQuery 不使用 Hibernate 会话缓存。但是,a) 没有证据,b) 他们不使用 SQLQuery.addEntity,这可能会提供允许 Hibernate 使用其缓存的信息。

文档没有提到以一种或另一种方式缓存。

如果我使用 addEntity,SQLQuery 是否使用会话缓存?

编辑:文档的这一部分说:

每当您将对象传递给 save()、update() 或 saveOrUpdate(),以及每当您使用 load()、get()、list()、iterate() 或 scroll() 检索对象时,该对象都会添加到Session 的内部缓存。

由于 addEntity() 允许 list() 返回对象,这意味着它正在使用缓存。我该如何检查?那些相同的文档说缓存有一种“包含”方法,可以浏览二级缓存,但不能浏览会话缓存。

编辑#2:通过打开 Hibernate 查询的日志记录,它似乎没有被缓存,但也许某些情况会使其缓存。

4

2 回答 2

2

我不认为 beny23 的回答是正确的。我相信setCacheable指的是二级缓存而不是会话缓存。

要检查实体是否在会话缓存中,您可以使用Session.contains(). 你也可以做一个快速测试:获取实体,修改它,关闭会话,看看 mod 是否在数据库中。

于 2012-08-23T22:04:52.610 回答
0

根据SQLQuery的 javadocs ,它扩展了Query接口,该接口提供了setCacheable方法(默认为 false),因此您应该能够执行以下操作:

Query query = session.createSQLQuery(
  "select * from my_table e")
  .addEntity(MyEntityClass.class)
  .setCacheable(true);

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

于 2012-08-23T21:57:57.590 回答