Поскольку это очень распространенный вопрос, я написал
эту статью , на которой основан этот ответ.
Однонаправленная ассоциация «один ко многим»
Как я объяснил в этой статье , если вы используете @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 не гарантирует, что изменения состояния ассоциации будут распространяться на базу данных.
Для получения более подробной информации о лучшем wat для синхронизации двунаправленных ассоциаций с JPA и Hibernate, ознакомьтесь с этой статьей .
Какой выбрать?
Однонаправленная @OneToManyассоциация не выполняет очень хорошо , поэтому следует избегать его.
Вам лучше использовать двунаправленный, @OneToManyкоторый является более эффективным .