何时适合使用双向关联,何时不使用?

时间:2011-06-13 06:52:04

标签: hibernate orm jpa entity-relationship

让我们假设我们想构建一个类似于eBay的应用程序,其中我们有一个名为Customer的实体和一个名为Order的实体。

从关系角度来看,我将其建模为:

Customer
+----+-----+
| ID | ... |
+----+-----+

Order
+----+-------------+-----+
| ID | CUSTOMER_ID | ... |
+----+-------------+-----+

现在,当我想将此映射到JPA时,我有多种选择:

  1. 创建从订单到客户的单向多对一关联。恕我直言,这是最接近关系模型。缺点是,为了找到给定客户的所有订单,我必须编写JPQL查询,因为客户对其订单一无所知。此外,我不能以自然的方式为客户添加新订单(例如customer.addOrder(aNewOrder);)。

  2. 创建从客户到订单的一对多关联。这样,为了找到给定客户的所有订单,我可以使用customer.getOders(),我可以以OO自然方式为客户添加新订单。缺点是,为了找出已下达给定订单的客户,我应该使用JPQL。

  3. 创建从客户到订单的双向一对多关联。这样我就不需要编写任何JPQL查询来检索客户或已下达给定订单的客户的所有订单。缺点是增加了维护双向关联的复杂性。

  4. 因此,我没有看到关于是否必须使用单向关联或双向关联是否“正确”的明确论据。换句话说,在我看来,这一切都归结为个人偏好和品牌设计师/实施者的品味。

    我是对的还是有规则可以确定给定关联的正确方向性?

1 个答案:

答案 0 :(得分:9)

很大程度上取决于您每个客户的预期订单数量。如果您希望每个客户订购许多订单(想想eBay),那么让客户处理与之相关的所有订单将不会非常有效(或者需要一些努力来保持懒惰的关联)。在这种情况下,我建议方法#1。编写一些查询没有错。

但是,如果您预计大部分客户的订单很少,那么双向方法#3就可以正常工作。

我认为#2中没有多少价值,因为订单总是与一个客户相关联。