Karena ini adalah pertanyaan yang sangat umum, saya menulis
artikel ini , yang menjadi dasar jawaban ini.
Asosiasi satu-ke-banyak searah
Seperti yang saya jelaskan di artikel ini , jika Anda menggunakan @OneToManyanotasi dengan @JoinColumn, maka Anda memiliki asosiasi searah, seperti yang terjadi antara Postentitas induk dan anak PostCommentdalam diagram berikut:

Saat menggunakan asosiasi satu-ke-banyak searah, hanya sisi induk yang memetakan asosiasi.
Dalam contoh ini, hanya Postentitas yang akan menentukan @OneToManyasosiasi ke PostCommententitas anak :
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Asosiasi dua arah dua arah
Jika Anda menggunakan @OneToManydengan mappedByatribut set, Anda memiliki hubungan dua arah. Dalam kasus kami, kedua Postentitas memiliki koleksi PostCommententitas anak, dan PostCommententitas anak memiliki referensi kembali ke Postentitas induk , seperti yang diilustrasikan oleh diagram berikut:

Dalam PostCommententitas, postproperti entitas dipetakan sebagai berikut:
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
Alasan kami menetapkan fetchatribut secara eksplisit FetchType.LAZYadalah karena, secara default, semua @ManyToOnedan @OneToOneasosiasi diambil dengan penuh semangat, yang dapat menyebabkan masalah kueri N +1. Untuk detail lebih lanjut tentang topik ini, lihat artikel ini .
Dalam Postentitas, commentsasosiasi dipetakan sebagai berikut:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
The mappedByatribut dari @OneToManyreferensi anotasi postproperti di anak PostCommententitas, dan, dengan cara ini, Hibernate tahu bahwa hubungan dua arah dikendalikan oleh @ManyToOnesisi, yang bertugas mengelola nilai kolom Foreign Key hubungan tabel ini didasarkan pada.
Untuk asosiasi dua arah, Anda juga perlu memiliki dua metode utilitas, seperti addChilddan removeChild:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Kedua metode ini memastikan bahwa kedua sisi dari asosiasi dua arah tidak sinkron. Tanpa menyinkronkan kedua ujungnya, Hibernate tidak menjamin bahwa perubahan status asosiasi akan menyebar ke database.
Untuk detail lebih lanjut tentang cara terbaik untuk menyinkronkan asosiasi dua arah dengan JPA dan Hibernate, lihat artikel ini .
Yang mana yang harus dipilih?
The searah @OneToManyasosiasi tidak melakukan dengan baik , sehingga Anda harus menghindarinya.
Anda lebih baik menggunakan bidirectional @OneToManyyang lebih efisien .