java 修改对象会更改Ehcache值

nbysray5  于 2023-06-20  发布在  Java
关注(0)|答案(2)|浏览(97)
@Override
    @Cacheable(value = "user-cache", key = "#login", unless = "#result == null")
    public User findUserByLogin(final String login)
    {
        return em.find(User.class, login);
    }

如果我将密码设置为null,例如如下所示。我所看到的缓存值也相应地被修改,因为在下一次调用中,缓存被命中,那里的密码被设置为NULL。这是正确的行为吗?如果我想修改对象,我必须在每次检索后创建一个新对象吗?我说的修改不是在数据库中更改,而是在服务级别上更改。

public User getUserByLogin(final String login)
{
    final User user = userRepository.findUserByLogin(login);
    user.setPassword(null);
    return user;
}
2nbm6dog

2nbm6dog1#

当在Ehcache中使用堆上层时,键和值是通过引用的。因此,对对象的任何修改都将反映该高速缓存中。

eivgtgni

eivgtgni2#

是的,这就是它的工作原理,正如路易斯上面评论的那样,它通过引用传递。
通过将以下配置添加到ehcache.xml文件,可以更改此行为,以便从缓存中创建新副本。参考文献[1]
copyOnRead=“true”copyOnWrite=“true”
例如:-

<cache name="MyMethod"
       maxEntriesLocalHeap="2000"
       eternal="false"
       overflowToDisk="false"
       memoryStoreEvictionPolicy="LRU"
       copyOnRead="true"
       copyOnWrite="true"
       timeToLiveSeconds="86400"/>

enjoy:)
参考文献; [1]:https://www.ehcache.org/generated/2.10.1/html/ehc-all/index.html#page/Ehcache_Documentation_Set%2Fco-cfgbasics_passing_copies.html%23

相关问题