web-dev-qa-db-ja.com

Spring Boot JPAは@Transactionalに.save()を必要としませんか?

短い質問があります:

_@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?
}
_

私はそれについてよくわからないので、誰かが主題にいくつかの光を当てることができますか?

11
Gregor Sklorz

エンティティを取得する場合、たとえばトランザクションメソッド内でfindOneメソッド呼び出しを使用すると、永続化プロバイダーによってその時点からエンティティはmanagedになっています。

このエンティティ(実際にはプロキシオブジェクト)に変更を加えると、トランザクションのコミット時に、saveまたはupdateメソッドを呼び出しても、それらの変更はデータベースに永続化されます。

saveまたはpersistは、新しいエンティティを最初から作成していて、永続化プロバイダーがその存在をまだ認識していない場合に使用する必要があります。

変更が発生する前に特定のエンティティでdetachまたはevictメソッドを使用すると、コミット時に変更を加えないようにすることができます。

10
Maciej Kowalski