我想知道如果我更改从 Hibernate 二级缓存检索到的 DOM 对象的属性,会发生什么。我找到了这句话:
2nd level cache stores a map of entities' IDs to other properties (it doesn't actually store objects, but the data itself)
在此答案中:https://stackoverflow.com/a/7059822/2468620 .
这应该意味着当我从二级缓存检索实体时,它是从存储的原始数据“新鲜”创建的。因此,如果我更改该实体的属性,它不会影响存储在二级缓存中的数据。这意味着当我在另一个 session 中再次检索实体时,其属性不应受到所描述的更改的影响。
例如:
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.util.concurrent.ConcurrentHashMap 相反,二级缓存可以是saved to the disk (意味着您始终获得基于磁盘的已保存数据的副本),因此它必须与内存中和基于磁盘的二级缓存实现保持一致。
关于java - 存储在 Hibernate 二级缓存中的对象是否保证为 "immutable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807020/