Play Framework勉強めも 複数Modelの連携/ModelをOne To Oneで連携する

memberフィールドの追加

//Message.java
@OneToOne(cascade = CascadeType.ALL)
    public Member member;

cascadeとはエンティティが更新された時に、関連付けられたエンティティまで更新するかどうか。
(今回でいうと、Messageが更新された時に関連付けられた、Memberも更新するかどうか)
CascadeType.ALLとする事で、関連付けられたもの全てを更新するようになる。
※cascadeは必ず設定する必要は無い。場合によっては手動でもOK。

toStringの修正

//Application.java
    @Override
    public String toString() {
        return ("[id:" + id + "member:<" + member.name + "," + member.mail + ">,message:" + message + "," + "date:"
                + postdate + "]");
    }

toStringはインスタンスを出力する。上記ではその際、どのように表示するかを設定している。
ちなみにインスタンスを受け取って表示しているのは、以下。

//index.scala.html
@(msg: String,datas:List[Message],datas2:List[Member])

@main("Sample Page") {
    <h1>Hello!</h1>
    <p>@msg</p>
    <hr>
    <p>Message Model</p>
    <p>@datas</p>
    <hr>
    <p>Member Model</p>
    <p>@datas2</p>
}

createメソッドの変更

//Application.java
public static Result create() {
        Form<Message> f = new Form(Message.class).bindFromRequest();
        if (!f.hasErrors()) {
            Message data = f.get();//①
            data.member = Member.findByName(data.name);//②
            data.save();

①:入力された「Message」データを取り出す
②:入力された「Message」データの「name」と一致する「Member」を取り出す

動作内容

①add2(Member)へ入力

スクリーンショット 2018-05-04 11.10.58.png

②Memberへ入力結果が保存される

スクリーンショット 2018-05-04 11.16.13.png

③add(Message)へ入力

スクリーンショット 2018-05-04 11.16.45.png

④MessageへMemberの内容も出力される

※今回はtoStringで出力するように編集した「名前+メールアドレス」が、Messageで表示される
スクリーンショット 2018-05-04 11.16.56.png

生成されるSQL文について

スクリーンショット 2018-05-04 11.40.57.png

messageのテーブルに、member_idが入っている。
テーブルにはMemberインスタンスのようなオブジェクトを保管する事は出来ないので、関連するMemberのIDを保管して、Memberを取得している。PlayFrameworkではフィールドを作るだけで、自動でその外部キーから関連するレコードを取り出してエンティティ化してくれている。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.