此问题在此处已有答案:
Transactional saves without calling update method(5个答案)
五年前就关门了。
我有个简短的问题:
是否需要对@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?
}
我只是不确定,所以也许有人可以在这个问题上提供一些线索?
1条答案
按热度按时间zaqlnxep1#
如果检索实体(例如,使用事务方法中的
findOne
方法调用),则从该点起,该实体已由持久性提供程序托管。现在,如果您对该实体(实际上是一个代理对象)进行了任何更改,则在事务提交时,这些更改将持久保存到数据库中,而不管是否调用
save
或update
方法。如果从头开始创建新实体,并且持久性提供程序尚不知道其存在,则必须使用
save
或persist
。请记住,如果在更改发生之前对特定实体使用
detach
或evict
方法,则可以防止在提交时进行任何更改。