LoginSignup
2
0

More than 5 years have passed since last update.

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

Posted at

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ではフィールドを作るだけで、自動でその外部キーから関連するレコードを取り出してエンティティ化してくれている。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0