gpt4 book ai didi

java - 防止先前加载的实体在事务方法中被更新

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:10 24 4
gpt4 key购买 nike

我的一项服务中有以下方法

@Override
@Transactional
public void createUserInfo(long userId, UserInfo userInfo) {
User oldUser = userService.findUserById(userId);

if (oldUser.infoIsTheSame(userInfo)) {
return;
}

User updatedUser = userService.addUserInfo(userId, userInfo);
feedService.addFeed(FeedAction.INFO_UPDATE, oldUser, updatedUser);
}

如您所见,findUserById()addUserInfo() 方法位于同一个服务中,该服务本身被标记为 @Transactional

由于 userService.findUserById()createUserInfo() 启动的同一事务中执行,oldUser 实例也会受到 addUserInfo() 内用户信息更改的影响(因为加载的托管实体位于同一事务中)。

所以我的问题是,当尝试 addFeed() 时,oldUserupdatedUser 在服务方法调用后是相同的。

所以我的问题是是否有办法进行更改以使 oldUser 不会受到影响?

请注意,更改 addUserInfo() 来启动新事务对我来说不是一个选项,因为它已在其他几个地方使用。

我还尝试复制 oldUser (例如通过 BeanUtils ),但问题仍然存在。

感谢帮助。

最佳答案

使用EntityManager.detach() ,将实体从持久化上下文中分离出来:

User oldUser = userService.findUserById(userId);

if (oldUser.infoIsTheSame(userInfo)) {
return;
}

em.detach(oldUser);
User updatedUser = userService.addUserInfo(userId, userInfo);
feedService.addFeed(FeedAction.INFO_UPDATE, oldUser, updatedUser);

关于java - 防止先前加载的实体在事务方法中被更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30254820/

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