Когда целесообразно использовать двунаправленную ассоциацию, а когда нет? - PullRequest
14 голосов
/ 13 июня 2011

Давайте представим, что мы хотим создать приложение, подобное eBay, в котором у нас есть сущность с именем Customer и сущность с именем Order.

С реляционной точки зрения я бы смоделировал это как:

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

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

Теперь, когда я хочу сопоставить это с JPA, у меня есть несколько вариантов:

  1. Создание однонаправленной связи "многие к одному" из заказа на клиента,ИМХО, это наиболее близкая к реляционной модели.Недостатком является то, что для того, чтобы найти все заказы для данного клиента, мне нужно написать запрос JPQL, так как клиент ничего не знает о своих заказах.Также я не могу естественным образом добавить новый заказ для клиента (например, customer.addOrder(aNewOrder);).

  2. Создать связь «один ко многим» от клиента к заказу.Таким образом, чтобы найти все заказы для данного клиента, я могу использовать customer.getOders() и добавить новые заказы для клиента естественным образом.Недостатком является то, что для определения клиента, который разместил данный заказ, я должен использовать JPQL.

  3. Создать двунаправленную связь один-ко-многим от клиента к заказу.Таким образом, мне не нужно писать какие-либо JPQL-запросы для получения всех заказов клиента или клиента, который разместил данный заказ.Недостатком является сложность в поддержании двунаправленной ассоциации.

Таким образом, я не вижу определенного аргумента относительно того, должна ли использоваться однонаправленная ассоциация или двунаправленная ассоциация"правильный".Другими словами, мне кажется, что все сводится к личным предпочтениям и вкусу дизайнера / разработчика модели.

Прав ли я или есть правила, по которым можно определить правильную направленность дляданное объединение?

1 Ответ

9 голосов
/ 13 июня 2011

Многое зависит от ожидаемого количества заказов на одного клиента. Если вы ожидаете много заказов на одного клиента (например, eBay), то иметь клиента со всеми связанными с ним заказами будет не очень эффективно (или потребуется некоторое усилие, чтобы поддерживать его как ленивую связь). В этом случае я рекомендую подход № 1. В написании некоторых запросов нет ничего плохого.

Однако, если вы ожидаете в основном клиентов с небольшим количеством заказов, то двунаправленный подход №3 будет работать просто отлично.

Я не вижу большой ценности в # 2, так как заказ всегда связан с одним клиентом.

...