1

次の 2 つのエンティティがあるとします。

としょうかん

public class Library
{
    private Collection<Book> books = new ArrayList<Book>();

    public boolean add(Book book)
    {
        return books.add(book);
    }
    public boolean remove(Book book)
    {
        return books.remove(book);
    }
}

public class Book
{
    private Library library;
    public setLibrary(Library library)
    {
        this.library = library;
    }
}

これは双方向の関係であり、おそらくすぐに壊れます。ライブラリにブックを追加しても、ブックのライブラリは更新されません。また、書籍のライブラリを更新しても、ライブラリは更新されません。

では、この双方向の関係をうまく維持するにはどうすればよいでしょうか。もちろん、add+removeで+ を実行することもできますsetLibraryが、その逆も可能ですが、これはおそらく . で終わるループを引き起こす可能性がありますStackOverflowError

4

4 に答える 4

2

リレーションの「所有者」を定義します。図書館がその本を「所有」しているか、それとも本が図書館を所有しているか?

その質問に対する答えは、誰が「スレーブ」エンティティを更新するかを示しています。

図書館が本を所有していると思うので、「図書館に本を追加する」コードは図書館に入り、後方参照を更新する必要があります。

于 2011-05-11T10:35:00.887 に答える
1

リレーションシップの所有者を定義するAaronの方法をお勧めしますが、//メソッドsetを現在の場所にとどまらせる別の方法は、対応するメソッド(inおよびin )も定義することです。リレーションのもう一方の端でo​​rメソッドを呼び出す前に、まず、orメソッドがすでに存在するかどうか、および存在しないかどうかを照会します。addremovehashasBookLibraryhasLibraryBookaddremove

于 2011-05-11T10:42:25.037 に答える
0

私は愚かですか?

public boolean add(Book book)
{
   book.setLibrary(this);
   return books.add(book);
}
public boolean remove(Book book)
{
   book.setLibrary(null);
   return books.remove(book);
}
于 2011-05-11T10:36:48.057 に答える
0

提案されたソリューションでは、ループを回避するために参照が等しいかどうかを確認できませんでしたか?

public boolean add(Book book)
{
   if(book.getLibrary != this) book.setLibrary(this);
   return books.add(book);
}
于 2011-05-11T10:40:07.117 に答える