This question already has answers here:
Transactional saves without calling update method

(5个答案)


3年前关闭。




我有一个简短的问题:

我需要repo.save(x)方法上的@Transactional调用吗?

我问是因为我没有保存就看到了数据库上的更改,并且没有阅读任何有关它的清晰文档。

那么它是按预期工作的,还是只是(受欢迎的)意外行为?

例:
@Autowired
private UserRepo repo;

@Transactional
@PutMapping
public Long put(@RequestBody User user)
{
  User u = repo.findOne(user.getId());
  u.setName("Paul");
  repo.save(u); // DO I NEED THIS LINE?
}

我只是不确定,所以也许有人可以对这个问题有所了解?

最佳答案

如果您检索某个实体,例如在事务方法中使用findOne方法调用,则持久性提供者将从那时起将其变为托管

现在,如果您对该实体(实际上是代理对象)进行了任何更改,则在提交事务后,无论是否调用saveupdate方法,这些更改都将保留在数据库中。

从头开始创建新实体时,必须使用savepersist,而持久性提供程序尚不知道其存在。

请记住,如果在更改发生之前在特定实体上使用detachevict方法,则可以防止在提交时进行任何更改。

07-28 01:31
查看更多