从Hibernate文档(强调我的):
默认情况下,实体不属于二级缓存,我们建议您坚持使用此设置。但是,您可以通过在persistence.xml文件中设置shared-cache-mode元素或在配置中使用javax.persistence.sharedCache.mode属性来覆盖它。
什么被缓存在二级缓存中?
答案 0 :(得分:0)
你有一级缓存和二级缓存。 第一级缓存仍然在事务上,这就是为什么必须调用flush以便在使用相同行的事务之间保持一致的原因。 然而,二级缓存在事务之间共享。
缓存相同的对象,区别在于它们是否在会话之间共享。
答案 1 :(得分:0)
默认情况下,禁用第二个缓存。
如果您想使用二级缓存,请尝试以下方法:
@Entity
@Table(name = "for_second_cache")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ObjectForSecondCache{
private Set<Document> documents;
}
此外,您应该知道二级缓存有许多不同的提供程序。
答案 2 :(得分:0)
Hibernate有2种缓存机制。
<强> 1。第一级缓存:
默认启用,无法禁用。它适用于会话中提供的缓存,即打开会话并执行数据库调用时。
例如,如果你为特定的id调用了session.get(<entity>, <id>)
并且在关闭会话之前,如果你再次使用相同的id调用它,那么Hibernate只会调用一次数据库,存储在第一级缓存;而对于第二个,它只是从缓存中获取它。
当执行session.save()
并且某些属性更新(在会话中)时,您可以看到好处,然后它会触发更新查询以反映所做的更改,而无需调用{{1 }}
<强> 2。二级缓存:
<强> 一个。缓存实体:
默认情况下已禁用此功能,并且适用于各个会话。它通常用于在会话工厂内的不同会话之间维护缓存,但也可以扩展到多个集群。
启用二级缓存后,您还需要指定要考虑用于缓存的类/实体。这可以确保Hibernate在调用数据库之前查看二级缓存(和第一级缓存)并相应地更新缓存,以便可以从缓存本身提供/检索更多请求。
例如,
session.update()
和
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_second_level_cache">true</property>
<强> 湾缓存查询:
同样,需要显式启用查询缓存以使查询可缓存。仅当启用了二级缓存时,这才有效。
在这种情况下,您需要使用@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class EntityToBeCached ...
对正在执行的查询标记查询/查询,以及在调用DB之前需要在缓存中查找的其他查询。
这是启用二级缓存所必需的。
query.setCacheable(true)
描述已经很长了,但我希望你有这个想法:)