Предположим, у вас есть заказ и заказ. Вы можете выбрать однонаправленную 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;