Tablo ilişkileri ve varlık ilişkileri
İlişkisel veritabanı sisteminde, yalnızca üç tür tablo ilişkisi olabilir:
- bire çok (Yabancı Anahtar sütunu ile)
- bire bir (paylaşılan Birincil Anahtar aracılığıyla)
- çoktan çoğa (iki ayrı ana tabloya başvuran iki Yabancı Anahtar içeren bir bağlantı tablosu aracılığıyla)
Yani, bir one-to-manytablo ilişkisi şöyle görünür:

İlişkinin post_idalt tabloda Yabancı Anahtar sütununa (ör. ) Dayandığını unutmayın.
Dolayısıyla, bir one-to-manytablo ilişkisini yönetmek söz konusu olduğunda tek bir gerçek kaynağı vardır .
Şimdi, one-to-manydaha önce gördüğümüz tablo ilişkisini eşleyen iki yönlü bir varlık ilişkisi alırsanız :

Yukarıdaki şemaya bakarsanız, bu ilişkiyi yönetmenin iki yolu olduğunu görebilirsiniz.
Gelen Postvarlık, sahip commentskoleksiyon:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
Ve içinde PostComment, postaşağıdaki gibi ilişki eşleştirilir:
@ManyToOne(
fetch = FetchType.LAZY
)
@JoinColumn(name = "post_id")
private Post post;
Varlık birliğini değiştirebilecek iki tarafınız var:
- Alt
commentskoleksiyona bir girdi ekleyerek post_comment, üst postvarlık ile post_idsütunu aracılığıyla yeni bir satır ilişkilendirilmelidir .
- Ayarlayarak
postözelliği PostCommentvarlık, post_idsütun sıra güncellenmelidir.
Yabancı Anahtar sütununu temsil etmenin iki yolu olduğundan, ilişkilendirme durumu değişikliğini eşdeğer Yabancı Anahtar sütun değeri değişikliğine çevirirken, gerçeğin kaynağı hangisi olduğunu tanımlamanız gerekir.
MappedBy (ters taraf olarak da bilinir)
mappedByNitelik söyler @ManyToOneyan Yabancı anahtar sütunu yönetiminden sorumlu olduğunu ve toplama çocuk varlığı getirilemiyor sadece kullanıldığı ve çocuklara kaskad ana varlık devlet değişikliklere (örneğin aynı zamanda çocuk varlıkları kaldırmalısınız ebeveyn kaldırma).
Buna ters taraf denir, çünkü bu tablo ilişkisini yöneten alt varlık özelliğine başvurur.
İki yönlü bir ilişkilendirmenin her iki tarafını senkronize etme
Şimdi, mappedByözelliği tanımlasanız ve alt taraf @ManyToOneilişkilendirmesi Yabancı Anahtar sütununu yönetse bile, çift yönlü ilişkilendirmenin her iki tarafını da eşitlemeniz gerekir.
Bunu yapmanın en iyi yolu şu iki yardımcı program yöntemini eklemektir:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
addCommentVe removeCommentyöntemler her iki taraf senkronize olduğundan emin olun. Dolayısıyla, bir alt varlık eklersek, alt öğenin ana öğeye işaret etmesi gerekir ve ana öğenin alt öğenin alt öğe koleksiyonunda bulunması gerekir.
Tüm çift yönlü varlık ilişkilendirme türlerini senkronize etmenin en iyi yolu hakkında daha fazla bilgi için bu makaleye göz atın .