そのまま使うだけじゃつまらないし、開発効率のことを考えて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 件のコメント:
コメントを投稿