Когда целесообразно использовать двунаправленную связь, а когда нет?
Предположим, что мы хотим создать приложение типа eBay, в котором у нас есть объект с именем Customer
и объект с именем Order
.
С реляционной точки зрения я бы моделировал это как:
Customer
+----+-----+
| ID | ... |
+----+-----+
Order
+----+-------------+-----+
| ID | CUSTOMER_ID | ... |
+----+-------------+-----+
Теперь, когда я хочу сопоставить это с JPA, у меня есть несколько вариантов:
-
Создайте однонаправленную связь "все-к-одному" от "Заказ клиенту". ИМХО, это самое близкое к реляционной модели. Недостатком является то, что для того, чтобы найти все заказы для данного клиента, я должен написать запрос JPQL, поскольку клиент ничего не знает о его заказах. Также я не могу естественным образом добавить новый заказ для клиента (например, customer.addOrder(aNewOrder);
).
-
Создайте связь "один ко многим" от Заказчика к заказу. Таким образом, чтобы найти все заказы для данного клиента, я могу использовать customer.getOders()
, и я могу добавить новые заказы для клиента естественным способом. Недостатком является то, что для того, чтобы узнать клиента, который разместил данный заказ, я должен использовать JPQL.
-
Создайте двунаправленную связь "один ко многим" от клиента к заказу. Таким образом, мне не нужно писать какие-либо запросы JPQL для извлечения всех заказов клиента или клиента, разместившего данный заказ. Недостатком является то, что добавлена сложность для поддержания двунаправленной связи.
Таким образом, я не вижу определенного аргумента в отношении того, нужно ли использовать однонаправленную связь или двунаправленная ассоциация является "правильной". Другими словами, мне кажется, что все это сводится к личным предпочтениям и вкусу дизайнера/исполнителя модели.
Я прав или есть правила, согласно которым можно определить правильную направленность для данной ассоциации?
Ответы
Ответ 1
Многое зависит от вашего ожидаемого количества заказов на одного клиента. Если вы ожидаете много заказов на одного клиента (думаю, eBay), то наличие клиента со всеми связанными с ним заказами не будет очень эффективным (или потребует усилий для поддержки как ленивой ассоциации). В этом случае я рекомендую подход №1. Нет ничего плохого в написании некоторых запросов.
Однако, если вы ожидаете в основном клиентов с несколькими заказами, то двунаправленный подход №3 будет работать нормально.
Я не вижу большого значения в # 2, поскольку порядок всегда связан с одним клиентом.