java如何防止双向关系中的循环
假设我们有以下两个实体
库
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;
}
}
这是一种双向关系,很可能很快就会破裂。即使向库中添加了一本书,该书的库也不会更新。即使你更新了一本书的图书馆,图书馆也不会更新
那么,您将如何以良好的方式保持这种双向关系?我当然可以在setLibrary
中做一个add
+remove
,反之亦然,但就我所知,这将导致一个循环,可能以StackOverflowError
结束
# 1 楼答案
我是在装傻吗
# 2 楼答案
为关系定义“所有者”。图书馆是“拥有”这本书还是这本书拥有图书馆
这个问题的答案告诉你谁更新了“奴隶”实体
我觉得图书馆拥有这本书,所以“将书添加到图书馆”代码应该进入图书馆,然后更新后面的参考资料
# 3 楼答案
在您提出的解决方案中,您不能检查引用是否相等以避免循环吗
# 4 楼答案
虽然我会推荐Aaron定义关系所有者的方法,但另一种允许
set
/add
/remove
方法保持不变的方法是,也定义相应的has
方法(hasBook
在Library
和hasLibrary
在Book
)。在调用关系另一端的add
或remove
方法之前,首先查询它是否已经存在,如果不存在,则不调用它