我有一个简短的问题:
我需要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?
}
我只是不确定,所以也许有人可以对这个问题有所了解?
答案 0 :(得分:9)
如果您检索实体,例如在事务方法中使用findOne
方法调用,则持久性提供程序从该点开始托管。
现在,如果您对该实体(实际上是一个代理对象)进行任何更改,那么在事务提交时,无论调用save
还是{{1},这些更改都将持久保存到数据库中方法。
update
或save
,并且持久性提供程序尚不知道它的存在。
请记住,如果在发生这些更改之前对该特定实体使用persist
或detach
方法,则可以阻止在提交时进行任何更改。