Ответ 1
Предположим, что у вас есть Ордер и OrderLine. Вы можете выбрать однонаправленную OneToMany между Order и OrderLine (у Order будет коллекция OrderLines). Или вы можете выбрать связь ManyToOne между OrderLine и Order (OrderLine будет иметь ссылку на свой Ордер). Или вы можете выбрать оба варианта, и в этом случае ассоциация становится двунаправленной ассоциацией OneToMany/ManyToOne.
Решение, которое вы выбираете, в основном зависит от ситуации и от уровня связи между объектами. Например, если у пользователя, компании, у провайдера есть много адресов, имеет смысл иметь однонаправленную связь между каждым из них и адресом, а адрес не знать об их владельце.
Предположим, что у вас есть Пользователь и Сообщение, где у пользователя могут быть тысячи сообщений, может иметь смысл моделировать его только как ManyToOne от Message to User, потому что вы редко запрашиваете все сообщения пользователя так или иначе. Связь может быть сделана двунаправленной только для помощи в запросах, поскольку, поскольку запросы JPQL соединяются между объектами путем навигации по их ассоциациям.
В двунаправленной связи вы можете оказаться в ситуации, когда график объектов несовместим. Например, Order A будет иметь пустой набор OrderLines, но некоторые OrderLines будут иметь ссылку на заказ A. JPA налагает обязательство всегда иметь одну сторону ассоциации, являющуюся стороной владельца, а другая сторона является обратной стороной. Обратная сторона игнорируется JPA. Сторона владельца - это сторона, которая решает, какое отношение существует. В двунаправленной ассоциации OneToMany сторона владельца должна быть большой стороной. Таким образом, в предыдущем примере сторона владельца была бы OrderLine, и JPA сохраняла бы связь между строками и порядком A, поскольку строки имеют ссылку на A.
Такая ассоциация будет отображаться следующим образом:
в порядке:
@OneToMany(mappedBy = "parentOrder") // mappedBy indicates that this side is the
// inverse side, and that the mapping is defined by the attribute parentOrder
// at the other side of the association.
private Set<OrderLine> lines;
в OrderLine:
@ManyToOne
private Order parentOrder;