我想知道,如果我更改从Hibernates二级缓存检索到的DOM对象的属性,会发生什么。我发现这句话:
二级缓存存储实体it到其他属性的映射(它实际上并不存储对象,而是数据本身)
在这个答案中: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"
我用呃cahce尝试了上面的例子,它确实有效,但我的问题是:
这种行为是有保证的吗?--我的意思是,即使我更改缓存提供程序,或者当使用的缓存提供程序的实现发生变化时,是否也可以依赖它?我查看了JPA规范,但没有找到这方面的信息。
发布于 2014-11-08 15:12:02
是的。第二级缓存为您提供了缓存实体数据的“副本”。
实体不是按原样存储的。在存储到缓存之前,实体必须脱水。当您从缓存中加载一个实体时,该实体将被重新水合物化,因此您总是会得到脱水数据的新副本。
与java.util.concurrent.ConcurrentHashMap不同,第二级缓存可以是保存到磁盘 (意味着始终得到基于磁盘的保存数据的副本),因此它必须与内存中和基于磁盘的二级缓存实现保持一致。
https://stackoverflow.com/questions/26807020
复制相似问题