我正在使用hibernate来运行命名的JPA查询。
查询从同一会话执行两次,查询应返回相同的行,因为数据库不会同时更改。
令我惊讶的是,查询返回的对象与这两个查询结果列表不同(数据相同但对象不同)。启用第一级缓存(默认情况下),我认为第二个查询应该返回与第一个查询相同的对象?
查询是一个简单的命名查询:
SELECT e from TABLE e where e.name=?1
查询以某种方式绕过缓存吗?或者我对第一级缓存的理解是错误的?
答案 0 :(得分:2)
这些结果在很大程度上取决于您是否为对象提供实体ID。
会话缓存和查询缓存在Hibernate中也是两回事。
如果从同一会话加载具有相同实体ID的对象,它将返回相同的对象。
但是如果你使用查询加载对象 - 这是一个不同的故事。无论你有什么实体ID,使用查询缓存都应该返回相同的数据。
默认情况下,未启用查询缓存。您必须执行query.setCacheable(true);
之类的操作以确保缓存查询。或者在Hibernate配置文件中设置hibernate.cache.use_query_cache
属性。