存储在Hibernate二级缓存中的对象是否保证是"不可变#34;?

时间:2014-11-07 17:46:02

标签: java hibernate caching orm immutability

如果我更改从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规范,但没有找到相关信息。

1 个答案:

答案 0 :(得分:0)

是的。二级缓存为您提供了一个"副本"缓存的实体数据。

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

java.util.concurrent.ConcurrentHashMap相反,二级缓存可能是saved to the disk(意味着您总是获得基于磁盘的已保存数据的副本),因此它必须与两者都一致-memory和基于磁盘的二级缓存实现。