前回は、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対応を実現できますが
あまり実践で使う機会が無いので今回は省略します。