假设我们有以下两个实体。
库
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}结尾的循环}}
答案 0 :(得分:2)
为关系定义“所有者”。图书馆“拥有”这本书还是图书拥有图书馆?
该问题的答案告诉您谁更新了“奴隶”实体。
我觉得图书馆拥有这本书,所以“添加图书库”代码应该进入库,然后更新后面的参考文献。
答案 1 :(得分:1)
虽然我建议使用Aaron定义关系所有者的方法,但允许set
/ add
/ remove
方法保留原样的替代方法是定义相应的{{ 1}}方法(has
中的hasBook
和Library
中的hasLibrary
。在关系的另一端调用Book
或add
方法之前,首先查询它是否已经存在,如果它没有调用它。
答案 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);
}