强制Hibernate将实际实例存储在二级缓存中

时间:2015-05-15 18:40:11

标签: java hibernate caching second-level-cache

Hibernate将缓存的实体存储为CachedEntry类的实例,这意味着每次从二级缓存请求实体时,都会根据CachedEntry中包含的数据创建该实体的新实例。

在大多数情况下,这是一种很好的方法,因为它可以防止缓存的数据被请求实体的代码意外修改。但是当存储的实体是不可变的时,这不可能发生。

我们有一堆实体对象,其中包含相当大的数据(具有很多属性),一旦编写,它们永远不会改变,因此实体对象是不可变的

有没有办法强制Hibernate将不可变对象存储为“实际实例”,这意味着对于每个不同的实体,缓存中只存在一个永远返回的不可变实例,而不是一直创建新实例?

我希望Hibernate在使用@Immutable注释的对象中具有此行为,但事实并非如此。

1 个答案:

答案 0 :(得分:1)

不可能在Hibernate中为不可变对象(实体)执行此操作,原因有多种,主要与关联有关:

  • 假设不可变对象具有关联集合(也是不可变实体)。该集合可能是懒惰的,这意味着该对象毕竟是有效可变的。对于懒惰的一对映射也是如此。

  • 缓存驱逐和过期策略很难定义。如果条目过期或从其缓存区域中逐出,那么如何处理仍在缓存中的其他实体中对该对象的引用?

  • 将实体存储到缓存将是更昂贵的操作,因为它涉及存储实体及其所有加载的关联(每个关联到其自己的缓存区域),并检查图形的哪些部分已经在缓存中。

  • 使用当前的Hibernate内部组件时,使用这种分离的实体会很困难。

  • 底层缓存提供程序仅存储对象的引用。它无法将缓存内容扩展到磁盘,堆栈或压缩它以实现更好的内存管理。

这些是我首先想到的原因,并且可能还有很多其他障碍会让Hibernate难以实现这一目标。

您可以在此blog中找到有关Hibernate二级缓存的更多信息,当然还可以在官方documentation中找到。