1

SoftwareTagという 2 つのクラスがあるとします。ソフトウェアは多くのタグに関連付けることができ、各タグは多くのソフトウェアに関連付けることができます。したがって、多対多の関係があります。

Hibernate と注釈を使用します。

@Entity
class Software .. {
    @ManyToMany
    public List<Tag> tags = new LinkedList<Tag>();
    ...
}

@Entity
class Tag .. {
    @ManyToMany(mappedBy = "tags")
    List<Software> softwares = new LinkedList<Software>();
    ... 
}

次に、既存のタグをソフトウェアに追加するたびに、このソフトウェアをそのタグに追加する必要があります (適切な多対多構造を維持するため)。このような:

class Software {
  ...
  public void add(Tag tag) {
    tags.add(tag);
    tag.add(software); 
  }
  ... 
}

この追加タグがすでに 1000 0000 ソフトウェアに関連付けられている場合、tag.add(sofware)を呼び出した時点で、Tag クラスはそれらすべてのソフトウェアをメモリにダウンロードして、ソフトウェアを 1 つだけ追加します。右?

質問: これを回避するためのベスト プラクティスは何ですか?

4

1 に答える 1

1

Hibernate を使用すると、データベース スキーマをオブジェクト指向の方法で考えることができます。しかし、かなり複雑なデータやかなり大きなデータに到達した場合でも、実際のデータベースの現実を頭に入れておく必要があります。データベース内の多対多の関係は、タグを表すテーブルとソフトウェアを表すテーブルへの外部キーを持つ別のテーブルとして実装されます。あなたの状況では、クラス SoftwareTag を追加してその多対多マッピング テーブルを表し、クラス Software を変更して SoftwareTags のリストを作成し、クラス タグからコレクションを削除します。ビジネス ロジックに基づいて、いくつかの findBy メソッドを DAO に追加する必要があるかもしれませんが、それは簡単なはずです。

于 2013-03-06T15:03:23.050 に答える