Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernates二级缓存中存储的对象是否保证;不变的;?_Java_Hibernate_Caching_Orm_Immutability - Fatal编程技术网

Java Hibernates二级缓存中存储的对象是否保证;不变的;?

Java Hibernates二级缓存中存储的对象是否保证;不变的;?,java,hibernate,caching,orm,immutability,Java,Hibernate,Caching,Orm,Immutability,我想知道如果我更改从Hibernates二级缓存检索到的DOM对象的属性,会发生什么。我发现这句话: 二级缓存存储实体ID到其他属性的映射(它实际上不存储对象,而是存储数据本身) 在这个答案中: 这意味着当我从二级缓存中检索实体时,它是从存储的原始数据“新”创建的。因此,如果我更改这个实体的属性,它不应该影响存储在二级缓存中的数据。这意味着,当我在另一个会话中再次检索实体时,其属性不应受到所述更改的影响 例如: user = userDao.find(1); // get

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

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

在这个答案中:

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

例如:

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规范,没有找到关于这方面的信息。

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

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

与第二级缓存不同,第二级缓存可以是(这意味着您始终可以获得基于磁盘的已保存数据的副本),因此它必须与内存中和基于磁盘的第二级缓存实现一致