java - 存储在 Hibernate 二级缓存中的对象是否保证为 "immutable"?

标签 java hibernate caching orm immutability

我想知道如果我更改从 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/

相关文章:

java - 我可以在 Java 中创建一个替代方法名称,以便可以通过自定义名称或所需的方法名称来调用它吗?

java - 确定上下文是否是特定 Activity

hibernate - weblogic.management.ManagementException : There is the same running task.

mysql - 增加键的数量是否会影响 memcached 的性能?

php - 清除另一个应用程序的 Symfony 缓存

java - 从 Java 应用程序加载自定义 DSL 配置的更好方法

java - 如何使用jdbc连接将excel表中的数据存储到mysql数据库中

java - 找不到 hibernate.cfg.xml - java 中的异常

Tomcat 中的 Hibernate 和 EJB3.1 - 需要什么才能实现这一点?

python - 为什么 functools.lru_cache 在处理普通方法时不缓存 __call__