为什么hibernate从同一个会话中返回同一查询中的不同对象?

时间:2013-04-07 23:07:16

标签: java hibernate jpa

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

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

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

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

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

查询以某种方式绕过缓存吗?或者我对第一级缓存的理解是错误的?

1 个答案:

答案 0 :(得分:2)

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

会话缓存和查询缓存在Hibernate中也是两回事。

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

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

默认情况下,未启用查询缓存。您必须执行query.setCacheable(true);之类的操作以确保缓存查询。或者在Hibernate配置文件中设置hibernate.cache.use_query_cache属性。