3

我正在使用休眠来运行命名的 JPA 查询。

查询从同一个会话执行两次,查询应该返回相同的行,因为同时数据库不会改变。

令我惊讶的是,查询返回的对象与这两个查询结果列表不同(数据相同但对象不同)。启用一级缓存(默认情况下),我认为第二个查询应该返回与第一个查询相同的对象?

该查询是一个简单的命名查询:

SELECT e from TABLE e where e.name=?1 

查询是否以某种方式绕过缓存?还是我对一级缓存的理解有误?

4

1 回答 1

4

这些结果很大程度上取决于您是否为对象提供实体 ID。

会话缓存和查询缓存在 Hibernate 中也是两个不同的东西。

如果您从同一会话加载具有相同实体 ID 的对象,它将返回相同的对象。

但是,如果您使用查询来加载对象 - 这是一个不同的故事。无论您拥有什么实体 ID,使用查询缓存都应该返回相同的数据。

查询缓存默认不开启。您必须执行类似query.setCacheable(true);的操作以确保查询已缓存。或者hibernate.cache.use_query_cache在 Hibernate 配置文件中设置属性。

于 2013-04-07T23:16:57.913 回答