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

Gre*_*orz 7 java spring jpa spring-data-jpa spring-boot

我有一个简短的问题:

我需要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?
}
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*ski 12

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

现在,如果对该实体(实际上是代理对象)进行任何更改,则在事务提交时,无论调用saveupdate方法的事实如何,这些更改都将持久保存到数据库.

save或者persist必须在从头开始创建新实体时使用,并且持久性提供程序还不知道它的存在.

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