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