Java / Ebean / Entity / ManyToOne

Java / Ebean / Entity / ManyToOne

自身が対象のレコードの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 指定されてなければならない。

find 時の挙動

ManyToOne の宣言を書いたことで関連があるとみなされる。 なので結果から getter を呼び出された場合そのタイミングで関連クエリが裏で発行されて、あたかもそれが存在したかのように取得できる。

fetch を用いることで一気に取得されるので都度のリクエストが発生しなくなる。 テーブルの構造的に ManyToOne はほぼノーリスクで動かせるので毎度フルで fetch してもよいだろう。

結合は left outer join される。

java/ebean/entity/manytoone.txt · 最終更新: 2021-02-03 10:17 by ore