Bire-Çok ve Çoka-Çok İlişkileri
@OneToMany, @ManyToMany ve @JoinTable yapılarını basamaklandırma türleri ve getirme stratejileriyle eşleyin.
Bire-Çok ve Çoka-Çok İlişkileri, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
JPA'da İlişki Türleri
JPA dört ilişki türünü destekler: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. Her biri yabancı anahtar veya birleştirme tablosu kısıtlamalarıyla eşlenir.
@ManyToOne: Sahip Taraf
Çoktan-bire ilişki (örneğin, birçok Order'ın tek bir User'a ait olması), yabancı anahtar için @ManyToOne ve bir @JoinColumn kullanılarak eşlenir.
@Entity
public class Order {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
}@OneToMany: Ters Taraf
Ters taraf (User'ın birçok Order'a sahip olması) @OneToMany(mappedBy = "user") kullanır. mappedBy özniteliği, FK'yi barındıran sahip taraftaki alanı gösterir.
@Entity
public class User {
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Order> orders = new ArrayList<>();
}Çift Yönlü Tutarlılık Yardımcısı
Çift yönlü ilişkilerde, veritabanına yazmadan önce nesne grafiğinin tutarlı kalması için ilişkinin her iki tarafını da bir yardımcı yöntemde güncel tutun.
public void addOrder(Order order) {
orders.add(order);
order.setUser(this); // keep both sides in sync
}
public void removeOrder(Order order) {
orders.remove(order);
order.setUser(null);
}Basamaklı İşlem Türleri
CascadeType.ALL, tüm işlemleri (kalıcılaştırma, birleştirme, silme, yenileme ve ayırma) üst varlıktan alt varlığa aktarır. PERSIST ve MERGE yaygın ve güvenli seçeneklerdir. REMOVE, üst varlık silindiğinde alt varlıkları da siler.
@OneToMany(mappedBy = "user",
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
orphanRemoval = true)
private List<Order> orders;orphanRemoval: Alt Varlıkların Otomatik Silinmesi
orphanRemoval = true, bir alt varlık üst varlığın koleksiyonundan çıkarıldığında onu siler; açıkça entityManager.remove() çağrılması gerekmez.
user.getOrders().remove(order); // triggers DELETE for the orphaned order on flush@ManyToMany ve @JoinTable
Çoktan-çoğa ilişki (örneğin, Student ve ders) bir birleştirme tablosu kullanır. Bu tabloyu sahip tarafta @JoinTable ile tanımlayın; ters taraf mappedBy kullanır.
@Entity
public class Student {
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private Set<Course> courses = new HashSet<>();
}Birleştirme Tablosundaki Ek Sütunlar
Birleştirme tablosunda ek sütunlar gerektiğinde (örneğin, kayıt tarihi), @ManyToMany ilişkisini, birleştirme tablosunu temsil eden yeni bir varlıkla iki @OneToMany / @ManyToOne ilişkisine dönüştürün.
@Entity
public class Enrollment {
@ManyToOne Student student;
@ManyToOne Course course;
private LocalDate enrolledAt;
}FetchType: LAZY ve EAGER
Varsayılan getirme davranışı: @ManyToOne ve @OneToOne EAGER'dır (hemen yüklenir). @OneToMany ve @ManyToMany LAZY'dir (erişildiğinde yüklenir). N+1 sorgularını önlemek için koleksiyonlarda her zaman LAZY kullanın.
// Always override to LAZY:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
private Category category;N+1 Sorgu Sorunu
Döngü içinde tembel bir koleksiyona erişmek, her varlık için bir sorgu çalıştırır (N+1). Koleksiyonu tek sorguda yüklemek için JPQL'de JOIN FETCH veya @EntityGraph kullanın.
// N+1 problem:
List<User> users = repo.findAll();
users.forEach(u -> u.getOrders().size()); // 1 + N queries!
// Fix:
@Query("SELECT u FROM User u LEFT JOIN FETCH u.orders")
List<User> findAllWithOrders();Koleksiyonlarda Set ve List
@ManyToMany için Set kullanın (yinelenen birleştirme satırlarını önler). Sıralama önemli olduğunda @OneToMany için List kullanın. @ManyToMany ile hiçbir zaman List kullanmayın; bu, tüm satırların silinip yeniden eklenmesine neden olur.
Kısa Kontrol
@OneToMany anotasyonunda mappedBy neyi belirtir?
Özet
Sahip tarafta (FK) @ManyToOne+@JoinColumn kullanın. Ters tarafta @OneToMany(mappedBy=...) kullanın. Koleksiyonlarda her zaman LAZY kullanın. N+1 sorununu JOIN FETCH ile çözün. Ek sütunları olan çoktan-çoğa ilişkiler için bir birleştirme varlığı kullanın.
Sıkça Sorulan Sorular
“Bire-Çok ve Çoka-Çok İlişkileri” dersi ücretsiz mi?
Evet — “Bire-Çok ve Çoka-Çok İlişkileri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Bire-Çok ve Çoka-Çok İlişkileri” dersinde ne öğreneceğim?
@OneToMany, @ManyToMany ve @JoinTable yapılarını basamaklandırma türleri ve getirme stratejileriyle eşleyin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Bire-Çok ve Çoka-Çok İlişkileri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- JPA Ek Açıklamalarıyla Varlık Eşleme
- Spring Data Depoları ve Sorgu Yöntemleri
- Bire-Çok ve Çoka-Çok İlişkileri
- Sayfalama, Sıralama ve Projeksiyonlar