Hibernate Annotations tips その1
今まででちょっと詰まったところとかをまとめ。
○Generation Gapパターン
Hibernateの入門用のこのページの4.2にGeneration Gapパターンについて紹介してある。
前提として既存のデータベースを使うという状況を想定。
詳細は省くとして、あるテーブルにアクセスするJavaオブジェクト(クラスA、通常は自動生成される)ってテーブル構造の変化によって変更しなきゃいけないんだけど、ユーザークラスがクラスAを直接使う場合、その都度ユーザクラスも変更しなければならない。それに対して、クラスAを継承したクラスBを作りユーザークラスはクラスBを使うようにすれば、テーブル構造の変化(=クラスAの変化)をクラスBで吸収できる、という感じ。
先ほどのページは通常のHibernateの場合だけど、Hibernate Annotationsを使った場合はどうなるか。
例えばこのページの用にデータベーススキーマからHibernate Annotationsを使ったコードを自動生成させるとして、でもそのクラスを直接ユーザークラスからは使わせたくない場合。
この場合、先ほどの例で言うクラスAがこんな感じになるように自動生成出来ればok。ポイントは@MappedSuperclass
@MappedSuperclass
public class BaseTableA {
@Id
@Column(name=”tableA_id”)
protected Integer tableAID;
@Column(name=”address_1″, length=20)
protected String address1;
}
public class BaseTableA {
@Id
@Column(name=”tableA_id”)
protected Integer tableAID;
@Column(name=”address_1″, length=20)
protected String address1;
}
で、それを継承するクラスB(手書き)はこんな感じ。外部からはプロパティaddress1だけにアクセスできるようにしてる。
@Entity
@Table(name=”table_a”)
public class TableA extends BaseTableA {
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
}
@Table(name=”table_a”)
public class TableA extends BaseTableA {
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
}