Poiché questa è una domanda molto comune, ho scritto
questo articolo , su cui si basa questa risposta.
Associazione one-to-many unidirezionale
Come ho spiegato in questo articolo , se usi l' @OneToManyannotazione con @JoinColumn, allora hai un'associazione unidirezionale, come quella tra l' Postentità genitore e il figlio PostCommentnel diagramma seguente:

Quando si utilizza un'associazione uno-a-molti unidirezionale, solo la parte padre mappa l'associazione.
In questo esempio, solo l' Postentità definirà @OneToManyun'associazione PostCommentall'entità figlio :
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Associazione uno-a-molti bidirezionale
Se si utilizza il set @OneToManycon l' mappedByattributo, si dispone di un'associazione bidirezionale. Nel nostro caso, sia l' Postentità ha una raccolta di PostCommententità figlio, sia l' PostCommententità figlio ha un riferimento Postall'entità madre , come illustrato dal diagramma seguente:

Nella PostCommententità, la poststruttura entità viene mappato come segue:
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
Il motivo per cui abbiamo impostato esplicitamente l' fetchattributo FetchType.LAZYè perché, per impostazione predefinita, tutte @ManyToOnee le @OneToOneassociazioni vengono recuperate con impazienza, il che può causare problemi di query N + 1. Per maggiori dettagli su questo argomento, consulta questo articolo .
Nella Postentità, l' commentsassociazione viene mappato come segue:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
L' mappedByattributo @OneToManydell'annotazione fa riferimento alla postproprietà PostCommentnell'entità figlio e, in questo modo, Hibernate sa che l'associazione bidirezionale è controllata dal @ManyToOnelato, che è responsabile della gestione del valore della colonna Chiave esterna su cui si basa questa relazione di tabella.
Per un'associazione bidirezionale, è inoltre necessario disporre di due metodi di utilità, come addChilde removeChild:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Questi due metodi garantiscono che entrambe le parti dell'associazione bidirezionale non siano sincronizzate. Senza sincronizzare entrambe le estremità, Hibernate non garantisce che le modifiche allo stato dell'associazione si propagheranno al database.
Per maggiori dettagli sul miglior wat per sincronizzare le associazioni bidirezionali con JPA e Hibernate, consulta questo articolo .
Quale scegliere?
L' associazione unidirezionale @OneToManynon funziona molto bene , quindi dovresti evitarlo.
Stai meglio usando il bidirezionale @OneToManyche è più efficiente .