親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

Entityの@ManyToOneでCascadeオプションの使い道

Entityの@ManyToOne

あるEntity(エンティティ)に対してフィールドを設定した時に、
Entityとフィールドが多対一の関係にある時に使用します。
このあたりの説明は長くなるので、詳細を知りたい人はぐぐって調べてみてください。

ただ@ManyToOneを付けるだけで問題なく動作するのですが、
@ManyToOneにはCascade(カスケード)というオプションも付与することができるのです。

意識したことがない人もいると思いますが、具体的な使い方を見てみましょう。

まずはEntityについて

まずCascadeの話題の前に、EntityManagerのメソッドで操作するEntityについてです。
Entityは一旦EntityManagerの永続性コンテキストに配置されます。

createで Entityに対して新規登録をした場合、DBへの保存がすぐに行われるわけではありません。
まずは永続性コンテキストに配置され、データベースに新規登録するデータだとマーク付けされるだけです。
あくまでDBへの保存が可能になる準備段階ですね。
「永続化」とか「永続性」とかよく聞きますがわかりづらい言葉ですよね。

Cascadeはデータベース操作に関連

DB操作で「ON DELETE CASCADE」オプションがあるように、
Cascadeを指定すると複数のテーブルにまたがるDB操作を連鎖的に行うことが可能になります。
例えば親表で行が削除されたときに、子表の対応する行を削除する場合やその逆パターンなどで。
もちろんプログラムで連鎖的に制御するように書いているのであれば不要なオプションですが、オプション一つで制御できるのは楽ですね。

CascadeTypeを指定することで、連鎖的に動作しせたいイベントも指定できるので、やみくもに全ての動作を連動させたくない時は連動させたいイベントに沿ったCascadeTypeを指定しましょう。