SpringBoot JPA在@Transactional上不需要.save()吗?

时间:2017-10-12 11:07:06

标签: java spring spring-boot jpa spring-data-jpa

我有一个简短的问题:

我需要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 个答案:

答案 0 :(得分:9)

如果您检索实体,例如在事务方法中使用findOne方法调用,则持久性提供程序从该点开始托管

现在,如果您对该实体(实际上是一个代理对象)进行任何更改,那么在事务提交时,无论调用save还是{{1},这些更改都将持久保存到数据库中方法。

当您从头开始创建新实体时,必须使用

updatesave,并且持久性提供程序尚不知道它的存在。

请记住,如果在发生这些更改之前对该特定实体使用persistdetach方法,则可以阻止在提交时进行任何更改。

相关问题