如何防止双向关系中的循环

时间:2011-05-11 10:31:48

标签: java entity-relationship foreign-key-relationship entities bidirectional

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

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,反之亦然,但据我所知,这会产生一个可能以{{1}结尾的循环}}

4 个答案:

答案 0 :(得分:2)

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

该问题的答案告诉您谁更新了“奴隶”实体。

我觉得图书馆拥有这本书,所以“添加图书库”代码应该进入库,然后更新后面的参考文献。

答案 1 :(得分:1)

虽然我建议使用Aaron定义关系所有者的方法,但允许set / add / remove方法保留原样的替代方法是定义相应的{{ 1}}方法(has中的hasBookLibrary中的hasLibrary。在关系的另一端调用Bookadd方法之前,首先查询它是否已经存在,如果它没有调用它。

答案 2 :(得分: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);
}

答案 3 :(得分:0)

在您提出的解决方案中,您是否无法检查引用是否相等以避免循环?

public boolean add(Book book)
{
   if(book.getLibrary != this) book.setLibrary(this);
   return books.add(book);
}