minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

1対n対応

前回は、Entity Beanの1対1対応を使いました。
今回は1対n対応を使ってみます。

Entity Bean "Person" と Entity Bean "Card" を結び付けてみます。
それぞれが持つフィールドは以下のようにします。

"Person"

id

プライマリ・キー

name

名前

cards

持っているカード(複数可)

"Card"

id

プライマリ・キー

companyName

カード会社名

サンプルコードは以下の通りです。

@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 を使います。

@OneToMany

1対n対応の「1」側のBeanに使用します。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

続けて @JoinColumn も記述する必要があります。

@JoinColumn(name = "personId")

@ManyToOne

1対n対応の「n」側のBeanに使用します。

@ManyToOne

先程と同じ定義の @JoinColumn も記述します。

@JoinColumn(name = "personId")

実装内容

Cardテーブルに、personIdカラムが定義されます。
Personテーブルにはidとnameカラムのみ定義され、personIdは定義されません。
Personに対応するCardは複数ある為、特定できないからです。

m対n対応について

最後に、m対n対応について。
JBossでは @ManyToMany というAnnotationを使ってm対n対応を実現できますが
あまり実践で使う機会が無いので今回は省略します。