@ManyToMany

<< 戻る   トップ >>

一つの記事は複数の(すくなくとも一つの)カテゴリに所属し、一つのカテゴリには複数の記事が属する。したがって記事の表とカテゴリの表は多対多、@ManyToMany の関係となり、SQL でこの関連を表すには中間表を用いる。これを JPA で取り扱おうとすると、記事エンティティとカテゴリエンティティだけができて、中間表を直接いじることはできないようだ。記事エンティティのなかで、一つ以上のカテゴリはカテゴリのコレクションとして表現される。記事を追加するとき、カテゴリを指定するにはどうしたらよいのか。これが @ManyToMany 問題なのである。

ブログ「Samehada3の日記」2007年04月「ManyToManyのメモ」にサンプルがあって、「所有・被所有」概念が重要であることと、所有側のリストに被所有側のエンティティを列挙すれば多対多の関係が構築できることがわかった。

それでは、DBコンバータのソースコードはどのようになっているかというと、DerbyArticle エンティティが次のように定義されている。

@JoinTable(name = "RELATION_AC", 
        joinColumns = { @JoinColumn(name = "ARTICLE", referencedColumnName = "ID") }, 
        inverseJoinColumns = { @JoinColumn(name = "CATEGORY", referencedColumnName = "ID") }
)
@ManyToMany
private Collection<DerbyCategory> categoryCollection;

アノテーション @ManyToMany が mappedBy 要素なしで用いられている。したがって DerbyArtilce が所有側のエンティティである。また、中間表が RERATION_AC であり、その中の ARTICLE 列が DerbyArtilce の ID を参照していること、逆に、RELATION_AC の CATEGORY列が DerbyArtilce の ID を参照していることが記述されている。これが多対多で中間表との関係が記述されている主要部となる。

被所有エンティティとなる DerbyCategory では次のように記述されている。

@ManyToMany(mappedBy = "categoryCollection")
private Collection<DerbyArticle> articleCollection;

アノテーション @ManyToMany に mappedBy 要素が記述されている。エンティティと表のマッピングは DerbyArtilce の categoryCollection で指定されいるというわけだ。

エンティティオブジェクトを生成するときに DerbyArticle と DerbyCategory の所有関係を指定した記憶がないのだが、とりあえず DerbyArticle が所有者というかたちでコードが生成されているようだ。こうなれば、まずカテゴリを移植して、それからそのカテゴリを参照しつつ記事を移植すればよいということになる。記事にはトラックバックの送信・受信の記録も外部の一対多の関係として含んでいるから、これらについても同様の処理が必要になる。


作成: 2013-09-18 11:29:18.0更新: 2013-09-18 11:29:18.0
http://museo-anonimo.jp/nanban/?id=1232,http://museo-anonimo.jp/nanban/tr/1232