Puisque c'est une question très courante, j'ai écrit
cet article , sur lequel cette réponse est basée.
Association un-à-plusieurs unidirectionnelle
Comme je l'ai expliqué dans cet article , si vous utilisez l' @OneToManyannotation avec @JoinColumn, vous avez alors une association unidirectionnelle, comme celle entre l' Postentité parent et l'enfant PostCommentdans le diagramme suivant:

Lorsque vous utilisez une association un-à-plusieurs unidirectionnelle, seul le côté parent mappe l'association.
Dans cet exemple, seule l' Postentité définira une @OneToManyassociation avec l' PostCommententité enfant :
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Association un-à-plusieurs bidirectionnelle
Si vous utilisez le @OneToManyavec l' mappedByensemble d'attributs, vous avez une association bidirectionnelle. Dans notre cas, l' Postentité a une collection d' PostCommententités enfants et l' PostCommententité enfant a une référence à l' Postentité parent , comme illustré par le diagramme suivant:

Dans l' PostCommententité, la postpropriété de l' entité est mappée comme suit:
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
La raison pour laquelle nous définissons explicitement l' fetchattribut FetchType.LAZYest que, par défaut, toutes les associations @ManyToOneet @OneToOnesont extraites avec impatience, ce qui peut entraîner des problèmes de requête N + 1. Pour plus de détails sur ce sujet, consultez cet article .
Dans l' Postentité, l' commentsassociation est mappée comme suit:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
L' mappedByattribut de l' @OneToManyannotation fait référence à la postpropriété dans l' PostCommententité enfant et, de cette façon, Hibernate sait que l'association bidirectionnelle est contrôlée par le @ManyToOnecôté, qui est chargé de gérer la valeur de colonne de clé étrangère sur laquelle cette relation de table est basée.
Pour une association bidirectionnelle, vous devez également disposer de deux méthodes utilitaires, comme addChildet removeChild:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Ces deux méthodes garantissent que les deux côtés de l'association bidirectionnelle ne sont pas synchronisés. Sans synchronisation des deux extrémités, Hibernate ne garantit pas que les changements d'état d'association se propageront à la base de données.
Pour plus de détails sur le meilleur wat pour synchroniser les associations bidirectionnelles avec JPA et Hibernate, consultez cet article .
Lequel choisir?
L' association unidirectionnelle @OneToManyne fonctionne pas très bien , vous devez donc l'éviter.
Il vaut mieux utiliser le bidirectionnel @OneToManyqui est plus efficace .