我有一个简短的问题:
我是否需要对@Transactional
方法进行repo.save(x)
调用?
我问是因为我在没有保存的情况下看到了数据库中的变化,也没有读到关于它的明确文档。
那么它是按预期工作,还是仅仅是一种(受欢迎的)意想不到的行为?
示例:
@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?
}
我只是不太确定,所以也许有人可以解释一下这个问题?
发布于 2017-10-12 11:20:03
如果您检索一个实体,例如在一个事务性方法中使用findOne
方法调用,那么它就变成了持久性提供者所管理的。
现在,如果您对该实体(实际上是一个代理对象)进行任何更改,那么在提交事务时,无论是否调用save
或update
方法,这些更改都将持久化到数据库中。
当你从头开始创建一个新的实体,而持久化提供者还不知道它的存在时,必须使用save
或persist
。
请记住,如果在更改发生之前对特定实体使用detach
或evict
方法,则可以防止在提交时进行任何更改。
https://stackoverflow.com/questions/46708063
复制