EBeanでOneToManyなリレーション
発端
PlayFramework2 with Javaを試していて、DBとの接続にEBeanを使っている。
ORMをちゃんと使うのは初めてなので練習的に。
基礎的な使用方法はいろんなサイトに乗っているのだけど、
ちょっと変?な使い方をしようとすると資料が少なくなる。
OneToManyなリレーション
Routeが複数のPinを持っている場合
Route側のモデル
@Entity public class Route extends Model{ @Id public long id; @Required public String name; public String memo; @Valid @OneToMany(cascade = CascadeType.ALL, mappedBy = "route") public List<Pin> pins = new ArrayList<>(); }
Pin側のモデル
@Entity public class Pin extends Model{ @Id public long pin_id; public String memo; @ManyToOne @JoinColumn(name = "route_id") public Route route; public long lat; public long lng; }
とするのが正解っぽい。
Routeモデル
@Valid @OneToMany(cascade = CascadeType.ALL, mappedBy = "route") public List<Pin> pins = new ArrayList<>();
@Valid
リレーション先もValidate対象にするアノテーション
@OneToMany(cascade = CascadeType.ALL, mappedBy = "route")
1:多のリレーション、親の方につける。
mappedBy
プロパティには、子のモデルの親を指すフィールド名を指定。
Pinモデル
@ManyToOne @JoinColumn(name = "route_id") public Route route;
@ManyToOne
多:1のリレーション、子の方につける。
@JoinColumn(name = "route_id")
親との結合に使用するカラム名かな?
しばらくできなかった時は、ManyToOneアノテーションだけにしていたからのようだ。
@ManyToOne(cascade= CascadeType.ALL) public Route route;
cascade= CascadeType.ALL
これをつけることで、リレーション先にも変更を行うそう。
例えば
Route route = Route.findById(1); Pin pin = route.pins.get(0); pin.delete();
とかすると、Routeまで削除されちゃう。
今日はここまで。