0

既存のHibernateエンティティに新しい多対多の関係を追加する必要があります。元のHibernateエンティティBeanまたはその構成には触れたくありません。私が追加しているのは、エンティティのデータ自体の一部ではなく、外部からの貢献と見なすことができる「タグ付け」機能です。

エンティティの主キーとタグIDの2つの列のみを持つ単純な結合テーブルが必要です。

単一のタグマッピングを含む新しい(人工の)エンティティタイプを導入せずに、Hibernateを使用してこのテーブルを管理できますか?

または、誤った方向に進んでいて、後で属性(タイムスタンプなど)を追加できるように、実際にこの「関係エンティティ」が必要ですか?

4

1 に答える 1

1

Hibernateの背後にある考え方は、特定の開始点からJavaオブジェクトツリーをトラバースできるようにすることです。元のオブジェクトからタグオブジェクトへの多対多の関係を定義する場合でも、タグオブジェクトで定義することができ、そのタグを持つ元のオブジェクトのリストを適切に取得できます。

欠点は、元のオブジェクトにタグのリストを照会できないことです(関係を逆にするための注釈と、タグオブジェクトのセットのリストを返すアクセサーが必要になります)。ただし、特定のタグでマークされた元のオブジェクトのリストを取得することはできます。

次に例を示します...タグ付けされるオブジェクトが投稿であると仮定しましょう。その場合、タグに多対多の関係を追加するコードを次に示します。これにより、特定のタグを持つ投稿のリストを検索できます。

@ManyToMany
@JoinTable(
    name = "TAG-POST",
    joinColumns = {@JoinColumn(name = "TAG-ID")},
    inverseJoinColumns = {@JoinColumn(name = "POST-ID")}
)
private Set<Posts> posts = new HashSet<Post>();

通常、投稿に関連するすべてのタグを検索できるようにすることもできますが、逆マッピングを省略できます。逆マッピングが必要な場合は、Postオブジェクトに次のようなものを追加する必要があります。

@ManyToMany(mappedBy = "tags")
private Set<Tag> tags = new HashSet<Tag>();

これで、投稿に関連するタグを検索することもできます。

投稿を読み直した後(そしてコメントを表示した後)、タグエンティティの作成をスキップすることにも関心があることに気付きました。タグ名しかなければ、説明した表しか使えないと思いますが、少し考え方を変える必要があります。あなたが実際に説明しているのは、投稿とそのタグエントリの間の1対多の関係です。この場合、投稿を一連のタグレコードにマッピングする必要があります。このレコードには、POST-IDとTAG-NAMEの2つの列があります。元のオブジェクトを変更しなくても、特定のTAG-NAMEを持つ投稿のリスト、または特定の投稿に関連するTAG-NAME行のリストをテーブルに照会できます。

これは実際にはエンティティを削除しないことに注意してください...Tagエンティティはありませんが、多対多のルックアップテーブルは、多対1の関係として作成する必要があります。これにより、エンティティになります。自体。ただし、このアプローチでは、使用するテーブルが1つ少なくなります。

于 2008-10-06T01:23:25.817 に答える