如果我更改从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规范,但没有找到相关信息。
答案 0 :(得分:0)
是的。二级缓存为您提供了一个"副本"缓存的实体数据。
实体未按原样存储。在存储到缓存之前,实体必须脱水。从缓存加载实体时,实体会重新水化,因此您始终可以获得脱水数据的新副本。
与java.util.concurrent.ConcurrentHashMap相反,二级缓存可能是saved to the disk(意味着您总是获得基于磁盘的已保存数据的副本),因此它必须与两者都一致-memory和基于磁盘的二级缓存实现。