38

例を挙げて質問を提示します。

以下のようなリポジトリがあることをアサートします。

public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {

}

JpaRepositoryインターフェイスを拡張することにより、ExampleObjectリポジトリは次のメソッドを継承します。

T findOne(ID id);

ここで、このメソッドの呼び出し後に ExampleObject への参照を受け取った場合、このメソッドに対して行ったすべての操作が自動的にデータベースに保存されることを確認しました。次に例を示します。

ExampleObject pointInCase = exampleObjectRepository.findOne(1L);
pointInCase.setName("Something else");

件名を読んで、これはExampleObjectインスタンスがであることを意味することを理解していますnot detached

これは私の期待に反します。CrudRepository変更を保存するには、継承された save メソッドを使用する必要があると予想していました。

T save(T entity);

Spring Data JPA リポジトリから返されたオブジェクトが標準としてアタッチされたままであることを確認し、API を使用してリポジトリ内のメソッドをマークして、デタッチされた参照のみを返すようにする方法を説明してくれる人はいますか?

エンティティの状態を変更すると、上記のsave(T entity)メソッドで使用すると定義も変更される可能性があると思いますので、更新のアイデンティティがどのように処理されるかについても理解していただければ幸いです。

4

3 に答える 3

28

それが JPA の基本原則です。添付された (管理された) エンティティを操作すると、これらの管理されたエンティティに加えられたすべての変更が自動的に永続化されます。

変更を永続的にしたくない場合は、変更を加えたり、トランザクションをロールバックしたりしないでください。

切り離されたエンティティでの作業は、すべての関連付けの遅延読み込みを妨げるため、悪夢です。いつでもEntityManager.detach()自分のエンティティを呼び出すことができますが、私はそうしません。それがどのように機能するかを理解し、それに対処するようにしてください。デメリットよりもはるかに多くのメリットがあります。そのうちの 1 つは、複雑なビジネス ロジックが行う可能性のあるすべての変更を保存することを考える必要さえないということです。これは、すべて JPA によって透過的に行われるためです。

于 2012-11-27T17:08:01.480 に答える