前回は、Entity Beanの1対1対応を使いました。
今回は1対n対応を使ってみます。
Entity Bean "Person" と Entity Bean "Card" を結び付けてみます。
それぞれが持つフィールドは以下のようにします。
"Person"
プライマリ・キー
名前
持っているカード(複数可)
"Card"
プライマリ・キー
カード会社名
サンプルコードは以下の通りです。
@Entity
public Person implements Serializable {
public Person(...) {
cards = new ArrayList<Card>();
Card card1 = new Card();
card1.setCompanyName(...);
card1.setPerson(this);
cards.add(card1);
Card card2 = new Card();
card2.setCompanyName(...);
card2.setPerson(this);
cards.add(card2);
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "personId")
public Collection<Card> getCards() { return cards; }
private Collection<Card> cards;
...
}
@Entity
public Card implements Serializable {
...
@ManyToOne
@JoinColumn(name = "personId")
public Person getPerson() { return person; }
...
private Person person;
...
}
先程と違い、Person / Card 両方にAnnotationを記述しています。
@OneToMany / @ManyToOne を使います。
1対n対応の「1」側のBeanに使用します。
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
続けて @JoinColumn も記述する必要があります。
@JoinColumn(name = "personId")
1対n対応の「n」側のBeanに使用します。
@ManyToOne
先程と同じ定義の @JoinColumn も記述します。
@JoinColumn(name = "personId")
Cardテーブルに、personIdカラムが定義されます。
Personテーブルにはidとnameカラムのみ定義され、personIdは定義されません。
Personに対応するCardは複数ある為、特定できないからです。
最後に、m対n対応について。
JBossでは @ManyToMany というAnnotationを使ってm対n対応を実現できますが
あまり実践で使う機会が無いので今回は省略します。