This question already has answers here:
Transactional saves without calling update method
(5个答案)
3年前关闭。
我有一个简短的问题:
我需要
我问是因为我没有保存就看到了数据库上的更改,并且没有阅读任何有关它的清晰文档。
那么它是按预期工作的,还是只是(受欢迎的)意外行为?
例:
我只是不确定,所以也许有人可以对这个问题有所了解?
(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
方法调用,则持久性提供者将从那时起将其变为托管。
现在,如果您对该实体(实际上是代理对象)进行了任何更改,则在提交事务后,无论是否调用save
或update
方法,这些更改都将保留在数据库中。
从头开始创建新实体时,必须使用save
或persist
,而持久性提供程序尚不知道其存在。
请记住,如果在更改发生之前在特定实体上使用detach
或evict
方法,则可以防止在提交时进行任何更改。