よく、DBテーブルは2つ以上のテーブルをJoinして使われます。
もちろんこれはパフォーマンスの面から言えばよくない事なのですが
保守性を高める意味では非常に有効な手段となります。
プログラムと同じように、DBにも同じレコードを複数格納するのは
避けた方が良いのです。
Entity Bean "Person" と Entity Bean "Address" を結び付けてみます。
それぞれが持つフィールドは以下のようにします。
"Person"
プライマリ・キー
名前
住所
"Address"
プライマリ・キー
郵便番号
街名
基本的な実装方法は Entity Bean のページを見てもらうことにして、
ここでは結び付けに関する事だけを記述します。
@Entity
public Person implements Serializable {
public Person(...) {
Address aAddress = new Address();
aAddress.setZipCode(...);
setAddress(address);
}
@Id(generate = GeneratorType.AUTO)
public int getId() { ... }
...
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "addressId")
public Address getAddress() { return address; }
private Address address;
...
}
@Entity
public Address implements Serializable {
@Id(generate = GeneratorType.AUTO)
public int getId() { ... }
...
}
Personの定義に (({@OneToOne}}} Annotationを記述します。
Addressの方は通常のEntity Beanと全く同じです。
つまり、Addressは単独でも使うことが出来ます。
今回は簡易の為、Personと結び付けるAddressをコンストラクタ内で作成しています。
文字通り、Entity Bean同士を1対1で結び付けます。
詳しい事は不明です。
とりあえず、このように記述しておけばいいようです。
@OneToOne(cascade = {CascadeType.ALL})
結び付けるためのカラムを定義します。
このカラムは、Personテーブル上に実装されることになります。
上の定義により、PersonとAddressは1対1対応となります。
実際のテーブル定義は、例えば以下のようになります。
CREATE TABLE Person ( id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), addressId INTEGER ); CREATE TABLE Address ( id INTEGER AUTO_INCREMENT PRIMARY KEY, zipCode VARCHAR(255), city VARCHAR(255) );
テーブルPersonに「addressId」というカラムが定義されています。
これがAddressテーブルのidとリンクしています。
|
|