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