首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Hibernates二级缓存中存储的对象是否保证是“不可变的”?

在Hibernates二级缓存中存储的对象是否保证是“不可变的”?
EN

Stack Overflow用户
提问于 2014-11-07 17:46:02
回答 1查看 121关注 0票数 1

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

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

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

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

例如:

代码语言:javascript
运行
复制
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规范,但没有找到这方面的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-08 15:12:02

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

实体不是按原样存储的。在存储到缓存之前,实体必须脱水。当您从缓存中加载一个实体时,该实体将被重新水合物化,因此您总是会得到脱水数据的新副本。

java.util.concurrent.ConcurrentHashMap不同,第二级缓存可以是保存到磁盘 (意味着始终得到基于磁盘的保存数据的副本),因此它必须与内存中和基于磁盘的二级缓存实现保持一致。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26807020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档