短い質問があります:
_@Transactional
_メソッドでrepo.save(x)
を呼び出す必要がありますか?
保存せずにDBの変更を確認し、それに関する明確なドキュメントを読みません。
それで、それは意図したとおりに機能していますか、それとも単なる(歓迎された)予期しない動作ですか?
例:
_@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?
}
_
私はそれについてよくわからないので、誰かが主題にいくつかの光を当てることができますか?
エンティティを取得する場合、たとえばトランザクションメソッド内でfindOne
メソッド呼び出しを使用すると、永続化プロバイダーによってその時点からエンティティはmanagedになっています。
このエンティティ(実際にはプロキシオブジェクト)に変更を加えると、トランザクションのコミット時に、save
またはupdate
メソッドを呼び出しても、それらの変更はデータベースに永続化されます。
save
またはpersist
は、新しいエンティティを最初から作成していて、永続化プロバイダーがその存在をまだ認識していない場合に使用する必要があります。
変更が発生する前に特定のエンティティでdetach
またはevict
メソッドを使用すると、コミット時に変更を加えないようにすることができます。