Java 防止在事务方法中更新以前加载的实体
我的一个服务中有以下方法Java 防止在事务方法中更新以前加载的实体,java,spring,transactions,Java,Spring,Transactions,我的一个服务中有以下方法 @Override @Transactional public void createUserInfo(long userId, UserInfo userInfo) { User oldUser = userService.findUserById(userId); if (oldUser.infoIsTheSame(userInfo)) { return; } User updatedUser = use
@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
和updateUser
在服务方法调用后是相同的
因此,我的问题是,是否有一种方法可以改变,使oldUser
不受影响
请注意,更改addUserInfo()
以启动新事务对我来说不是一个选项,因为它在其他几个地方都有使用
我还试图复制旧用户
(例如通过),但问题仍然存在
Thnx获取帮助。使用,将实体从持久性上下文中分离:
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);
您可以尝试从会话中分离
oldUser
。如果您使用的是Hibernate-session.execit()
,与JPA 2.0-entityManager.detach()配合使用