我真的只有两种方法可以解决这个问题,这两种方法你都提到了。就个人而言,我会采用第一种方法(将映射对象创建为 OO 实体)。这可以防止您保留冗余信息并且必须同步;这也意味着,如果协会最终拥有自己的字段(比如说,书籍被分配到该类别的日期),它们可以很容易地合并。我们将这种方法用于我们系统中的各种关联。
OO 实体如下所示:
BookCategory {
Book book
Category category
}
Book {
Collection <BookCategory> categories
}
Category {
Collection <BookCategory> categories
}
在这里,您必须保持关系对象和两个集合同步;但是,在这种情况下,集合是可选的。通常,您可以使用 ORM 查询获得相同的信息,例如: select b.book from BookCategory b where b.category = MyCategory
另一种方法是进行如下设置:
Book {
Collection<Category> categories
}
Category {
Collection<Books> books
}
如果您的 ORM/DB 工具自动维护关联,这很好;否则,您将无法更新这两个集合。(在 Hibernate 中,一侧将在映射上具有属性:inverse=true;这一侧未更新,因此严格来说不需要维护。不过,在我看来,这似乎是一种不好的做法。)
如果您通常仅以一种方式访问关系(例如,获取一个类别中的所有书籍),则可以消除另一侧的集合;那么我认为您必须使用 ORM 工具并使用本机查询才能从另一个方向访问关系。
我们在项目中使用 Hibernate(一个基于 java 的对象关系映射工具);Hibernate 文档是 OO/关系设计问题的一个很好的参考,尽管您可能需要花一点时间学习 Hibernate 以使其有用:
http ://docs.jboss.org/hibernate/stable/core/reference/en/ html_single/#collections-ofvalues
!