2013-01-06

GAE/J+Slim3+Google Cloud SQL+Hibernate+DbUnit(1)

GAE/J+Slim3からGoogle Cloud SQLを使ってみた。
そのまま使うだけじゃつまらないし、開発効率のことを考えてHibernateを使う方法を調べてみた。またテストにDbUnitを使う方法も一緒に調べてみた。

まずはモデル定義、よくある部署と所属ユーザーでやってみる。
ER図はこんな感じ、
部署テーブル(Division)とユーザーテーブル(User)、部署とユーザーの関係を表すUserDivisionテーブルの3つで、モデルクラスを作成するのはDivisionとUserのみ、ソースは次のようになる。(単純なsetter,getterは省略してある)
長くなるので、とりあえずUserクラスだけ、Divisionクラスは後日。


Userクラス
  • テーブルとの関係付け
    • @Entity
    • @Table: 'name'でテーブル名を指定する
  • 主キー
    • @Id
    • @Column: 'name'でカラム名を指定する
  • 楽観的排他制御
    • @Version
    • @Temporal(TemporalType.TIMESTAMP): カラムの属性を指定する
    • @Column: 'name'でカラム名を指定する
  • テーブル間関係
    • @ManyToMany: 多対多の関係を定義する
    • @JoinTable: 'name'で結合テーブルを指定する。'joinColumns'でUserテーブルとの結合カラムを指定する。'inverseJoinColumns'でDivisionテーブルとの結合カラムを指定する
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name = "User")
public class User implements java.io.Serializable {
    private int id;
    private String name;
    private String email;
    private Date timestamp;
    private Set<Division> divisions = new HashSet<Division>();

    public User() {

    }

    public User(String name, Set<Division> divisions) {
        this.name = name;
        this.divisions = divisions;
    }

    /**
     * idを取得する
     * @return id
     */
    @Id
    @Column(name = "id", unique = true, nullable = false)
    public int getId() {
        return this.id;
    }

    /**
     * idを設定する
     * @param id
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * timestampを取得する
     * @return timestamp
     */
    @Version
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "timestamp")
    public Date getTimestamp() {
        return this.timestamp;
    }

    /**
     * timestampを設定する
     * @param timestamp
     */
    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    /**
     * divisionsを取得する
     * @return divisions
     */
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "UserDivision",
        joinColumns = { @JoinColumn(name = "user_id")},
        inverseJoinColumns = {@JoinColumn(name = "division_id")})
    public Set<Division> getDivisions() {
        return this.divisions;
    }

    /**
     * divisionsを設定する
     * @param divisions
     */
    public void setDivisions(Set<Division> divisions) {
        this.divisions = divisions;
    }
}

0 件のコメント: