我的一项服务中有以下方法
@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()
时oldUser
和updatedUser
是相同的。
所以我的问题是,是否有办法改变,oldUser
不会受到影响?
请注意,更改addUserInfo()
以启动新交易不适合我,因为它在其他几个地方使用。
我还尝试复制oldUser
(例如通过BeanUtils),但问题仍然存在。
Thnx寻求帮助。
答案 0 :(得分:0)
使用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);