一対一マッピングや一対多マッピングなどの以前のチュートリアルでは、hibernateで関連するエンティティのマッピ そこで、リレーションシップオーナーエンティティが保存されるたびに、マップされたエンティティを保存したかったのです。 これを有効にするには、”CascadeType”属性を使用しました。 このJpaカスケードタイプのチュートリアルでは、CascadeType経由でカスケードするためのさまざまなタイプのオプションについて学びます。
JPAカスケードタイプはどのように機能しますか?
先に進む前に、このcascade type属性がコード内でどのように定義されているかを見てみましょう。 より明確な理解のための例を見てみましょう。 従業員が複数のアカウントを持つことができるシナリオを考えますが、1つのアカウントは1人の従業員にのみ関連付ける必要があります。 明確にするために、最小限の情報でエンティティを作成しましょう。
EmployeeEntity。java
AccountEntity。java
上記のソースコードの太字の行を見てくださいEmployeeEntity.java
cascade=CascadeType.ALL
EmployeeEntity
AccountEntity
にカスケードする必要があることを意味します。 従業員を保存すると、関連するすべてのアカウントもデータベースに保存されます。 従業員を削除すると、その従業員に関連付けられているすべてのアカウントも削除されます。 十分に簡単。しかし、保存操作のみをカスケードし、削除操作はカスケードしない場合はどうなりますか。 次に、以下のコードを使用して明確に指定する必要があります。
save()またはpersist()メソッドがemployeeインスタンスを使用して呼び出された場合にのみ、アカウントのみが永続化されます。 セッションで他のメソッドが呼び出された場合、その効果は/cascade to accountsには影響しません。
JPAカスケードタイプ
Java永続性アーキテクチャでサポートされているカスケードタイプは次のとおりです。
- CascadeType。PERSIST:cascade type
presist
は、save()またはpersist()操作が関連するエンティティにカスケードすることを意味します。 - CascadeType.マージ : cascade type
merge
は、所有するエンティティがマージされるときに関連するエンティティがマージされることを意味します。 - CascadeType.REFRESH:cascade type
refresh
はrefresh()操作でも同じことを行います。 - CascadeType.REMOVE:cascade type
remove
所有しているエンティティが削除されると、この設定との関連するすべてのエンティティの関連付けを削除します。 - CascadeType.DETACH:cascade type
detach
“手動デタッチ”が発生した場合、関連するすべてのエンティティをデタッチします。 - CascadeType.すべて : cascade type
all
は、上記のすべてのカスケード操作の省略形です。
JPAにはデフォルトのカスケードタイプはありません。 デフォルトでは、操作はカスケードされません。
cascade構成オプションはCascadeTypesの配列を受け入れるため、この例のように一対多のリレーションシップのカスケード操作に更新とマージのみを含めるには、次のようになります。
上記のカスケードでは、accounts collectionはマージされ、更新されます。
Hibernate Cascade Types
今、私たちはそれを使用するシナリオでhibernateでカスケードが何であるかを理解することができます。
jpaが提供するカスケードタイプとは別に、hibernateには”orphan removal”と呼ばれる、上記の通常のセットの一部ではないカスケード操作がもう一つあります。 これにより、所有しているオブジェクトが所有関係から削除されると、データベースから所有オブジェクトが削除されます。
例で理解しましょう。 従業員とアカウントエンティティの例では、以下のようにそれらを更新し、アカウントで「orphanRemoval=true」と述べました。 基本的には、「accounts setからaccountを削除する」(つまり、そのaccountとEmployeeの関係を削除することを意味します)を意味します。
EmployeeEntity。java
AccountEntity。java
TestOrphanRemovalCascade。java
これは、コレクションから一致/不一致の項目を削除する非常に良い方法です(つまり、多対一または一対多の関係)。 あなたはコレクションからアイテムを削除し、あなたのために残りのものを世話して休止状態にするだけです。 エンティティが任意の場所から参照されているかどうかをチェックします。
hibernate5cascade typesまたはJPA cascade typesに関するあなたの考えや質問があれば教えてください。
幸せな学習!
幸せな学習!!カスケードタイプに関するOracle Blog