gpt4 book ai didi

java - @Cacheput 不适用于仅更新插入

转载 作者:可可西里 更新时间:2023-11-01 10:53:51 25 4
gpt4 key购买 nike

下面是我的代码片段。 @cacheput 仅在第一次调用时将数据插入到 redis 中。第二次调用保存函数时不更新值。引用中的 CacheManager 是 RedisCacheManager。

@CachePut(cacheNames = "User", key = "#user.Id")
@Override
public Optional<User> save(User user) {
if(em.contains(user) || user.isPersisted()) { // merge if exists
User retVal = em.merge(user);
retVal.setPersisted(true);
System.out.println("hashCode after merge-->"+retVal.hashCode());
return Optional.ofNullable(retVal);
} else {
em.persist(user);
user.setPersisted(true);
return Optional.ofNullable(user);
}
}

正在使用的依赖:

<dependency>
<groupId>biz.paluch.redis</groupId>
<artifactId>lettuce</artifactId>
<version>4.3.2.Final</version>
</dependency>

我确实验证了要更新的对象的哈希码和第一次保存时插入的对象的哈希码,它们是不同的。

最佳答案

我发现了问题。我的保存方法在用

注释的 DAO 类中

@Transactional

.尽管发生了数据库提交,但直到整个全局事务成功提交后,Redis 提交才发生。所以我加了

@Transactional(propagation=Propagation.REQUIRES_NEW)

使用 @cacheput 方法对我所有 Dao 类中的事务注释进行修改,这解决了我的问题。考虑到我们在两阶段提交中可能面临的问题,我知道在 DAO 方法上添加它是一个坏主意。但在我目前的用例中,这不是问题。

关于java - @Cacheput 不适用于仅更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48588457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com