Вопрос по jpa, java-ee, hibernate, one-to-many, many-to-one – Спящий режим / JPA ManyToOne против OneToMany

36

Я читаю в настоящее время документацию Hibernate относительнообъединения организаций и я сталкиваюсь с небольшой трудностью, чтобы выяснить некоторые вещи. Это в основном связано с разницей междуManyToOne а такжеOneToMany ассоциации. Хотя я использовал их в реальных проектах, я не могу полностью понять разницу между ними. Насколько я понимаю, если таблица / сущность имеетManyToOne ассоциация с другой, тогда ассоциация должна быть с другой стороныOneToMany, Итак, как мы должны решить, какой из них выбрать в зависимости от конкретного случая и как это влияет на базу данных / запросы / результаты? Есть ли хороший пример везде?

П.С .: Я считаю, что это было бы полезно из-за его актуальности для вопроса, если бы кто-то мог, кроме того, объяснить, в чем смысл владельца ассоциации и разницу между двунаправленной и однонаправленной ассоциацией.

Ваш Ответ

2   ответа
3

@ManytoOne сторона, поскольку владелец будет требовать только n + 1 запросов при сохранении ассоциаций. Где n - количество ассоциаций (много сторон).

Принимая во внимание, что@OneToMany как владелец, при вставке родительской сущности (одна сторона) с ассоциациями (много сторон) получилось бы 2 * N + 1 запросов. В котором один запрос будет для вставки ассоциации, а другой запрос для обновления внешнего ключа в ассоциированном объекте.

53

у вас есть Order и OrderLine. Вы можете выбрать однонаправленное OneToMany между Order и OrderLine (Order будет иметь коллекцию OrderLines). Или вы можете установить связь между ManyToOne между OrderLine и Order (OrderLine будет иметь ссылку на свой Order). Или вы можете выбрать оба варианта, и в этом случае связь становится двунаправленной ассоциацией OneToMany / ManyToOne.

Решение, которое вы выбираете, в основном зависит от ситуации и от уровня связи между сущностями. Например, если у пользователя, компании, провайдера много адресов, было бы разумно иметь однонаправленный адрес между каждым из них и адресом, а адрес не знать об их владельце.

, у вас есть Пользователь и Сообщение, где пользователь может иметь тысячи сообщений, поэтому имеет смысл смоделировать его только как ManyToOne от Сообщения к Пользователю, потому что вы 'В любом случае, я редко буду запрашивать все сообщения пользователя. Ассоциация может быть сделана двунаправленной только для помощи с запросами, поскольку JPQL-запросы объединяются между сущностями путем навигации по их ассоциациям.

В двунаправленной ассоциации вы можете оказаться в ситуации, когда график объектов не согласован. Например, у Order A будет пустой набор OrderLines, но некоторые OrderLines будут иметь ссылку на Order 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>

в OrderLine:

@ManyToOne
private Order parentOrder;

Похожие вопросы