Bu çok yaygın bir soru olduğundan, bu cevabın dayandığı bu makaleyi yazdım
.
Tek yönlü bire çok ilişkilendirme
Açıkladığım gibi Bu makalede , @OneToManyek açıklamayı kullanırsanız , aşağıdaki diyagramda @JoinColumnüst Postvarlık ile alt öğe arasındaki gibi tek yönlü bir ilişkilendirmeniz olur PostComment:

Tek yönlü bire çok ilişkilendirme kullanırken, yalnızca üst taraf ilişkilendirmeyi eşler.
Bu örnekte, yalnızca Postvarlık @OneToMany, alt kuruluşla bir ilişki tanımlayacaktır PostComment:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Çift yönlü bire çok ilişkilendirme
Öznitelik seti @OneToManyile birlikte kullanırsanız, mappedByçift yönlü bir ilişkilendirmeniz olur. Bizim durumumuzda, hem Postişletmenin PostCommentçocuk varlıkları koleksiyonu hem de çocukPostCommentPost aşağıdaki şemada gösterildiği gibi ana varlığa geri gönderilir :

İçinde PostComment varlık, postaşağıdaki gibi varlık özelliği eşleştirilmiş:
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
fetchÖzniteliği açıkça ayarlamamızın FetchType.LAZYnedeni, varsayılan olarak tümü @ManyToOneve@OneToOne dernekler N + 1 sorgu sorunlarına neden olabilir, hangi hevesle getirilmez. Bu konu hakkında daha fazla bilgi için bu makaleye göz atın .
İçinde Post varlık, commentsaşağıdaki gibi ilişki eşleştirilir:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
mappedByÖznitelik @OneToManyaçıklama referanslar postçocuk mülk PostCommentvarlık ve bu şekilde, Hazırda çift yönlü ilişki ile kontrol edilir bilir @ManyToOnebu tablo ilişki dayanmaktadır Yabancı anahtar sütun değerinin yönetiminden sorumlu olan tarafı.
İki yönlü bir ilişkilendirme için, iki yardımcı yönteminizin olması gerekir. addChild ve removeChild:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Bu iki yöntem, çift yönlü ilişkinin her iki tarafının da eşitlenmemesini sağlar. Her iki ucu senkronize etmeden Hazırda Beklet, ilişkilendirme durumu değişikliklerinin veritabanına yayılacağını garanti etmez.
Çift yönlü ilişkileri JPA ve Hazırda Bekletme ile senkronize etmek için en iyi wat hakkında daha fazla bilgi için göz atın bu makaleye .
Hangisini seçmeli?
Tek yönlü@OneToMany ilişki çok iyi performans göstermediği için bundan kaçınmalısınız.
Daha verimli olan çift yönlü@OneToMany kullanmanız daha iyi olur .