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