2013-04-07 60 views
1

我正在使用hibernate来运行命名的JPA查询。为什么hibernate会从同一个会话的同一个查询中返回不同的对象?

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

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

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

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

是缓存随查询莫名其妙地绕过?或者我对第一级缓存的理解是错误的?

+0

您可以添加您用于查询的代码吗?你的对象是否有实体键? – 2013-04-07 23:35:06

回答

2

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

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

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

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

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

+0

我并不完全遵循实体密钥的意思吗?是实体的@Id属性? – Wudong 2013-04-07 23:45:50

+0

对不起,Id是我的意思 – 2013-04-08 00:33:19

相关问题