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-many
tablo ilişkisi şöyle görünür:
İlişkinin post_id
alt tabloda Yabancı Anahtar sütununa (ör. ) Dayandığını unutmayın.
Dolayısıyla, bir one-to-many
tablo ilişkisini yönetmek söz konusu olduğunda tek bir gerçek kaynağı vardır .
Şimdi, one-to-many
daha ö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 Post
varlık, sahip comments
koleksiyon:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
Ve içinde PostComment
, post
aş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
comments
koleksiyona bir girdi ekleyerek post_comment
, üst post
varlık ile post_id
sütunu aracılığıyla yeni bir satır ilişkilendirilmelidir .
- Ayarlayarak
post
özelliği PostComment
varlık, post_id
sü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)
mappedBy
Nitelik söyler @ManyToOne
yan 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 @ManyToOne
iliş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);
}
addComment
Ve removeComment
yö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 .