【问题标题】:Are objects stored in Hibernates 2nd level cache guaranteed to be "immutable"?存储在 Hibernates 二级缓存中的对象是否保证是“不可变的”?
【发布时间】:2014-11-07 17:46:02
【问题描述】:

我想知道如果我更改从 Hibernates 二级缓存中检索到的 DOM 对象的属性会发生什么。我找到了这句话:

二级缓存存储实体 ID 到其他属性的映射(它实际上并不存储对象,而是数据本身)

在这个答案中:https://stackoverflow.com/a/7059822/2468620

这应该意味着当我从二级缓存中检索一个实体时,它是从存储的原始数据“新”创建的。因此,如果我更改此实体的属性,它不应该影响存储在二级缓存中的数据。这意味着当我在另一个会话中再次检索实体时,其属性不应受到所描述的更改的影响。

例如:

user = userDao.find(1);             // get user stored in second level cache

System.out.println(user.getName()); // returns "originalName"

user.setName("modifiedName");

// === this is done in a different session ===

user = userDao.find(1);

System.out.println(user.getName()); // should return "originalName"

我用 eh-cahce 尝试了上面的例子,它确实有效,但我的问题是:

这种行为是否得到保证?我的意思是即使我更改了缓存提供程序,或者当我使用的缓存提供程序的实现发生更改时,我是否可以依赖它?我查看了 JPA 规范并没有找到这方面的信息。

【问题讨论】:

    标签: java hibernate caching orm immutability


    【解决方案1】:

    是的。二级缓存为您提供缓存实体数据的“副本”。

    实体未按原样存储。实体在存储到缓存之前必须脱水。当您从缓存中加载实体时,实体会重新水化,因此您始终会获得脱水数据的新副本。

    java.util.concurrent.ConcurrentHashMap 不同,二级缓存可以是saved to the disk(意味着您始终会获得基于磁盘的已保存数据的副本),因此它必须与内存中和基于磁盘的二级缓存实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2011-05-04
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多