Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

4.10. 遷移の永続化

個々のオブジェクトを保存、削除、または再アタッチすることは非常に面倒です (特に、関連付けられたオブジェクトのグラフを扱う場合)。典型的なケースは親子関係です。以下の例を考えてください。
親子関係の子が値タイプ (たとえば、アドレスまたは文字列のコレクション) である場合、ライフサイクルは親に依存しステータス変更の便利な「カスケード」に対して何も行う必要がありません。親が永続化された場合、値タイプの子オブジェクトも永続化されます。親が削除された場合は、子が削除されます。これは、コレクションからの子の削除などの操作にも該当します。Hibernate はこれを検出し、値タイプオブジェクトが参照を共有できるため、データベースから子を削除します。
親および子オブジェクトがエンティティであり、値タイプでない同じシナリオを考えてください (たとえば、カテゴリとアイテム、または親猫と子猫)。エンティティは独自のライフサイクルを持ち、共有された参照をサポートし (したがって、コレクションからのエンティティの削除は、エンティティを削除できることを意味しません)、デフォルトであるエンティティから他の関連エンティティへのステータスのカスケードが行われません。JPA 仕様では、到達可能性による永続性は必要ありません。Hibernate で最初に示されたように遷移の永続化の柔軟なモデルがサポートされます。
エンティティマネージャの各基本操作 (persist()merge()remove()refresh()) に対して、対応するカスケードスタイルが存在します。カスケードスタイルの名前はそれぞれ PERSIST、MERGE、REMOVE、REFRESH です。関連エンティティ (またはエンティティのコレクション) に対して操作をカスケードする場合は、関係アノテーションにそれを示す必要があります。
@OneToOne(cascade=CascadeType.PERSIST)
カスケードオブジェクトは組み合わせることができます。
@OneToOne(cascade= { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH } )
CascadeType.ALL を使用してすべての操作を特定の関係に対してカスケードするよう指定することもできます。デフォルトでは操作がカスケードされないことに注意してください。
Hibernate は、ネイティブのカスケードオプションを提供します。詳細については、Hibernate Annotations マニュアルと Hibernate リファレンスガイドを参照してください。
推奨事項:
  • 通常、@ManyToOne 関係または @ManyToMany 関係でカスケードを有効にすることは適切ではありません。多くの場合、カスケードは、@OneToOne 関係および @OneToMany 関係で役に立ちます。
  • 子オブジェクトのライフスパンが親オブジェクトのライフスパンにより制限を受ける場合は、CascadeType.ALLorg.hibernate.annotations.CascadeType.DELETE_ORPHAN を指定して親を完全ライフサイクルオブジェクトにしてください (孤立削除のセマンティクスについては、Hibernate リファレンスガイドを参照)。
  • それ以外の場合は、カスケードをまったく必要としません。ただし、同じトランザクションで親と子を処理することが多く、入力を省略したい場合は、cascade={PERSIST, MERGE} の使用を考えてください。これらのオプションは多対多の関係に適切です。