Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止在事务方法中更新以前加载的实体_Java_Spring_Transactions - Fatal编程技术网

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()配合使用