menu
書いてる野郎
orebike@gmail.com
自身が対象のレコードのIDを保持していて、それを結合してもってきたいという場合
@Entity @Table(name="piyo") public class Piyo extends Model{ @Id private long id; private String name; private long hogeId; // name は自身のテーブルのフィールド。 ↑ の hogeId に該当するもの // referencedColumnName は相手テーブルのフィールド @ManyToOne @JoinColumn(name="hoge_id", referencedColumnName="id") private Hoge hoge; // 以下 getter setter }
結合相手を示すために対象の型で指定する。
@ManyToOne
アノテーションは対象との関係性を示している。 Many は自身(この場合は Piyo)である。
結合基準を示すために @JoinColumn
アノテーションを付与する。
自身のテーブルのどのフィールドをキーに相手をもってくるかを name
で指定。
この指定は DB のテーブルのフィールド名を指定していて、自身の Java のフィールド名ではない。
相手のテーブルのどのフィールドをキーを見るのかを referencedColumnName
で指定する。
相手のテーブルは One 側を示す Entity の型から決定される。
自身のフィールドが 相手テーブル名_id
、相手のテーブルの結合フィールドが id
の場合 @JoinColumn
指定が無くても結合できる。
JoinColumn で指定できる相手のフィールドは必ず PK 指定になっていなければならない。つまり Id アノテーションがついている必要がある。
ManyToOne で結合した先でまた ManyToOne 結合する
相互関連がある部分は相互参照になる。
JoinColumns アノテーションを使うと複合キーを使っての結合もできる。 ここでもその結合するキーはすべて Id アノテーションにより PK 指定されてなければならない。
ManyToOne の宣言を書いたことで関連があるとみなされる。 なので結果から getter を呼び出された場合そのタイミングで関連クエリが裏で発行されて、あたかもそれが存在したかのように取得できる。
fetch を用いることで一気に取得されるので都度のリクエストが発生しなくなる。 テーブルの構造的に ManyToOne はほぼノーリスクで動かせるので毎度フルで fetch してもよいだろう。
結合は left outer join される。