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 , @OneToMany
ek açıklamayı kullanırsanız , aşağıdaki diyagramda @JoinColumn
üst Post
varlı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 Post
varlı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 @OneToMany
ile birlikte kullanırsanız, mappedBy
çift yönlü bir ilişkilendirmeniz olur. Bizim durumumuzda, hem Post
işletmenin PostComment
çocuk varlıkları koleksiyonu hem de çocukPostComment
Post
aşağıdaki şemada gösterildiği gibi ana varlığa geri gönderilir :
İçinde PostComment
varlık, post
aş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.LAZY
nedeni, varsayılan olarak tümü @ManyToOne
ve@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, comments
aşağıdaki gibi ilişki eşleştirilir:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
mappedBy
Öznitelik @OneToMany
açıklama referanslar post
çocuk mülk PostComment
varlık ve bu şekilde, Hazırda çift yönlü ilişki ile kontrol edilir bilir @ManyToOne
bu 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 .