Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Javaで軽快に使える「軽量フレームワーク」特集
~本格的なRoRスタイルフレームワーク「Play!」(3)

第9回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/02/04 14:00

 注目の軽量フレームワークをフットワーク軽く取り上げていく本連載。連載第9回目となる今回は、Javaの本格的RoRスタイルフレームワーク「Play!」の第3回として、複数モデルの連携についてと、アプリケーションのテストについて解説していきます。

目次

はじめに

 MVCのごく基本的なことが分かったら、次に見たいのは、本格的な開発で必要となる機能がどのような形で実装されているか、ということでしょう。今回は「1対多」「多対1」による複数モデルの連携処理についてと、JUnitを使ったアプリケーションのテストについてです。どちらも、実際に開発に利用する際には必要となる機能と言えます。これらがPlay!ではどのような形で作られているのかを考えていきましょう。

対象読者

  • Javaで手ごろなフレームワークを探している技術者
  • 最近のフレームワークをごくざっと理解しておきたい方
  • Web開発の手法がどうも気に入らない、と常々考えているJavaプログラマ

モデルの連携を考える

 前回、モデルの基本について説明をしましたが、単純に1つのモデルを作って動かすだけなら、非常に簡単に使用できることが分かりました。では、複数のモデルと連携する場合はどうなるのでしょうか。実際に作りながら考え方を見ていきましょう。

 前回の簡単なメッセージ表示モデル(MsgData)に加え、ユーザー情報のモデルとしてPersonDataというクラスを作成することにしましょう。そしてMsgDataでは、nameではなく、このPersonDataのデータと関連付けることにします。こうした場合、SQLでは関連するデータのidなどを登録するフィールドを用意しておき、JOINを使って関連するテーブルまで含めて検索を行いました。しかし、Play!ではJPAを使い、データをSQLのテーブルではなく、オブジェクトとして永続化し管理しています。従って、モデルの連携も、オブジェクトとオブジェクトの関係をつける形で設計します。

 まず、新しいPersonDataクラスを作成しましょう。「models」フォルダ内に、新たに「PersonData.java」というファイルを作成し、次のようにソースコードを記述します。

package models;

import java.util.*;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import play.db.jpa.Model;

@Entity
public class PersonData extends Model {
	public String name;
	public String mail;
	@OneToMany
	public List<MsgData> messages;
	
	public PersonData(String name,String mail){
		this.name = name;
		this.mail = mail;
		this.messages = new ArrayList<MsgData>();
	}

}

 ここでは、nameとmailという2つのフィールドのほかに、MsgDataインスタンスを保管するListをフィールドとして用意しています。ここに、関連するMsgDataをまとめようというわけです。このとき、注意しなければいけないのは「@OneToManyアノテーションを用意する」ということでしょう。JPAでは、オブジェクトの永続化をするとき、こうした他のモデルのインスタンスの参照を含んでいると、そのままでは永続化できません。@OneToManyをつけることで、このフィールドが一対多対応のオブジェクト参照のためのものであることをJPAに知らせることができます。

MsgDataの修正

 続いて、MsgDataです。こちらも、nameの代りにPersonDataの参照を保管するように修正しておきましょう。

package models;

import java.util.Calendar;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import play.db.jpa.Model;

@Entity
public class MsgData extends Model {
	private static final long serialVersionUID = 1L;
	public String message;
	@ManyToOne
	public PersonData person;
	public Date time = Calendar.getInstance().getTime();
	
	public MsgData(String message,PersonData person){
		this.person = person;
		this.message = message;
		person.messages.add(this);
	}
}

 こちらは、PersonDataインスタンスを保管するpersonフィールドを用意しています。そしてこれには「@ManyToOne」というアノテーションをつけます。こうすることで、このMsgDataも永続化できるようになります。newする際には、引数にPersonDataインスタンスを渡し、personプロパティに設定すると同時に、personのmessages.addを呼び出してperson側にthisを保管するようにしています。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 掌田 津耶乃(ショウダ ツヤノ)

    三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆活動をする傍ら、ログハウスの普及活動にいそしんでいる。(掌田津耶乃のWebサイトはこちら) ※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開中。またGoogle+プロフ...

バックナンバー

連載:Javaで軽快に使える「軽量フレームワーク」特集

もっと読む

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5