Оскільки це дуже поширене питання, я написав
цю статтю , на якій ґрунтується ця відповідь.
Односпрямована асоціація «багато хто»
Як я пояснив у цій статті , якщо ви користуєтесь @OneToManyанотацією @JoinColumn, ви маєте однонаправлену асоціацію, як та, яка знаходиться між материнським Postоб'єктом та дитиною PostCommentна наступній схемі:

При використанні однонаправленої асоціації один на багато, лише батьківська сторона відображає асоціацію.
У цьому прикладі лише Postсутність визначатиме @OneToManyасоціацію з дочірнім PostCommentоб'єктом:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Двонаправлена асоціація «багато хто»
Якщо ви використовуєте @OneToManyз mappedByнабором атрибутів, у вас є двостороння асоціація. У нашому випадку обидва суб'єкти Postмають сукупність PostCommentдочірніх сутностей, а дочірнє PostCommentутворення має посилання на материнське Postсутність, як це проілюстровано наступною схемою:

В PostCommentсутності, то postвластивість об'єкта відображаються наступним чином :
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
Причина, з якою ми явно встановлюємо fetchатрибут, FetchType.LAZYполягає в тому, що, за замовчуванням, всі @ManyToOneта @OneToOneасоціації збираються охоче, що може спричинити N + 1 запитів. Більш детально про цю тему перегляньте цю статтю .
В Postоб'єкті commentsасоціація відображається так:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
mappedByАтрибут @OneToManyанотацію посилається на postвласність в дитячій PostCommentсуті, і, таким чином, Hibernate знає , що двунаправленное об'єднання під контролем@ManyToOne стороною, яка відповідає за управління значенням стовпця зовнішнього ключа цього відношення таблиці засноване на.
Для двосторонньої асоціації вам також потрібно мати два корисні методи, як-от addChildі removeChild:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Ці два методи забезпечують синхронізацію обох сторін двонаправленої асоціації. Без синхронізації обох кінців, Hibernate не гарантує, що зміни стану асоціації поширюватимуться на базу даних.
Щоб отримати докладнішу інформацію про найкращий Ват для синхронізації двосторонніх асоціацій із JPA та Hibernate, перегляньте цю статтю .
Який вибрати?
Односпрямована @OneToManyасоціація не виконує дуже добре , тому слід уникати його.
Вам краще використовувати двонаправлену, @OneToManyяка є більш ефективною .