1

假设我们有以下两个实体。

图书馆

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+反之亦然removesetLibrary但据我所知,这会导致一个可能以StackOverflowError.

4

4 回答 4

2

为关系定义一个“所有者”。图书馆“拥有”这本书还是这本书拥有图书馆?

该问题的答案会告诉您谁更新了“从属”实体。

我觉得图书馆拥有这本书,所以“将书添加到图书馆”代码应该进入图书馆,然后更新后面的引用。

于 2011-05-11T10:35:00.887 回答
1

虽然我会推荐 Aaron 定义关系所有者的方法,但允许set/ add/remove方法保留在原处的替代方法是定义相应的has方法(hasBookinLibraryhasLibraryin Book)。在调用关系另一端的addorremove方法之前,首先查询它是否已经存在,如果不存在则不调用它。

于 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 回答