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)へ入力
②Memberへ入力結果が保存される
③add(Message)へ入力
④MessageへMemberの内容も出力される
※今回はtoStringで出力するように編集した「名前+メールアドレス」が、Messageで表示される
生成されるSQL文について
messageのテーブルに、member_idが入っている。
テーブルにはMemberインスタンスのようなオブジェクトを保管する事は出来ないので、関連するMemberのIDを保管して、Memberを取得している。PlayFrameworkではフィールドを作るだけで、自動でその外部キーから関連するレコードを取り出してエンティティ化してくれている。