この問題を解決するために私が考えることができる方法は実際には2つしかありません。どちらもあなたが言及しました。個人的には、最初のアプローチ (オブジェクト指向エンティティとしてマッピング オブジェクトを作成する) を使用します。これにより、冗長な情報を保持したり、同期する必要がなくなります。また、関連付けが独自のフィールド (本がそのカテゴリに割り当てられた日付など) を持つことになった場合、それらを簡単に組み込むことができることも意味します。このアプローチは、システム内のさまざまな関連付けに使用されます。
OO エンティティは次のようになります。
BookCategory {
Book book
Category category
}
Book {
Collection <BookCategory> categories
}
Category {
Collection <BookCategory> categories
}
ここでは、関係オブジェクトと 2 つのコレクションの同期を維持する必要があります。ただし、この場合、コレクションはオプションです。通常、次のような ORM クエリを使用して同じ情報を取得できます。 select b.book from BookCategory b where b.category = MyCategory
別の方法は、次のようなセットアップを行うことです。
Book {
Collection<Category> categories
}
Category {
Collection<Books> books
}
ORM/DB ツールが関連付けを自動的に維持する場合、これで問題ありません。そうしないと、両方のコレクションを更新できなくなります。(Hibernate では、マッピングで一方の側にプロパティ: inverse=true があります。この側は更新されないため、厳密に言えば維持する必要はありません。ただし、これは悪い習慣のように思えます。)
通常、関係に 1 つの方法でのみアクセスする場合 (たとえば、カテゴリ内のすべての本を取得するなど)、反対側のコレクションを削除できます。次に、ORM ツールを回避し、ネイティブ クエリを使用して、別の方向から関係にアクセスする必要があると思います。
プロジェクトでは Hibernate (Java ベースのオブジェクト リレーショナル マッピング ツール) を使用します。Hibernate のドキュメントは、オブジェクト指向/リレーショナル設計の問題の良いリファレンスですが、Hibernate の学習に少し時間を費やす必要があるかもしれません:
http://docs.jboss.org/hibernate/stable/core/reference/en/ html_single/#collections-ofvalues
チッ!