SpringBoot JPA 不需要 .save() on @Transactional?

2022-09-01 03:08:37

我有一个简短的问题:

我是否需要调用方法?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?
}

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


答案 1

如果检索实体(例如,在事务方法中使用方法调用),则该实体已由持久性提供程序从该点开始进行管理findOne

现在,如果对该实体(实际上是代理对象)进行任何更改,则在事务提交时,这些更改将保留到数据库中,而不管调用 or 方法的事实如何。saveupdate

save或者,当您从头开始创建新实体并且持久性提供程序尚不知道其存在时,必须使用。persist

请记住,如果在提交时对该特定实体使用 或 方法,则可以阻止在提交时进行任何更改。detachevict


答案 2

推荐