6.1 Derin bağımlılık yönetimi

Ve @OneToMany ek açıklamaları ve benzerleri hakkında daha yararlı ve ilginç şeyler . Hepsinin yaygın olarak kullanılan 4 seçeneği vardır:

  • basamaklı = CascadeType.ALL
  • yetimKaldırma = doğru
  • getirme = FetchType.LAZY

Şimdi onları daha ayrıntılı olarak analiz edeceğiz. Ve en ilginç olanla başlayacağız - CascadeType . Bu parametre, ana varlığı değiştirirsek bağımlı varlıklara ne olacağını belirler.

JPA spesifikasyonu, bu parametre için aşağıdaki değerlere sahiptir:

  • TÜM
  • SÜREKLİ
  • BİRLEŞTİRMEK
  • KALDIRMAK
  • YENİLE
  • AYIR

Ancak Hazırda Bekletme, bu belirtimi üç seçeneğe daha genişletir:

  • TEKRARLAMAK
  • SAVE_UPDATE
  • KİLİT

Elbette veri tabanı ve CONSTRANIS ile güçlü bir paralellik var. Ancak farklılıklar da var. Hazırda Bekletme, veritabanıyla yapılan gerçek işi olabildiğince gizlemeye çalışır, bu nedenle bu Hazırda Bekletme Basamakları tam olarak Entity nesneleriyle ilgilidir.

6.2 Kademeli Tip

Cascade parametresi, üst öğelerini (ana nesne) değiştirirsek bağımlı nesnelere ne olacağını açıklar. Çoğu zaman bu parametre, nesne bağımlılıklarını açıklayan ek açıklamalarla birlikte kullanılır:

Örnek:

OneToOne(cascade = CascadeType.ALL)

Veya bunun gibi:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

Ayrı bir açıklama olarak da yazılabilir:

@Cascade({ org.hibernate.annotations.CascadeType.ALL })

Şimdi bu ek açıklamaların ne anlama geldiği hakkında daha fazla konuşalım.

6.3 TÜMÜ, SÜREKLİLİK, BİRLEŞTİRME

CascadeType.ALLüst nesneyle gerçekleştirdiğimiz tüm eylemlerin bağımlı nesneleri için tekrarlanması gerektiği anlamına gelir .

CascadeType.PERSISTana nesneyi veritabanına kaydedersek, aynısının bağımlı nesneleri için de yapılması gerektiği anlamına gelir. Örnek:


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.PERSIST, mappedBy="task")
   private EmployeeTask task;
}

Bu sınıfla çalışmaya bir örnek:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
 
session.persist(director);
session.flush();

Yalnızca Çalışan türünde bir nesneyi kaydederiz, bağımlı nesnesi ÇalışanGörevi otomatik olarak veritabanına kaydedilir.

CascadeType.MERGEveritabanındaki ana nesneyi güncellersek, aynısının bağımlı nesneleri için de yapılması gerektiği anlamına gelir.

6.4 KALDIR, SİL, AYIR

CascadeType.REMOVEveritabanındaki bir üst nesneyi silersek, aynısının onun bağımlı nesneleri için de yapılması gerektiği anlamına gelir.

CascadeType.DELETEAynı anlamındadır. Bunlar eş anlamlıdır. Sadece farklı özelliklerden.

CascadeType.DETACHana nesneyi oturumdan kaldırırsak, aynı işlemin onun bağımlı nesneleri için de yapılması gerektiği anlamına gelir. Örnek:


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.DETACH, mappedBy="task")
   private EmployeeTask task;
}

Bu sınıfla çalışmaya bir örnek:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
director.task = task;
session.flush();
 
assertThat(session.contains(director)).isTrue();
assertThat(session.contains(task)).isTrue();
 
session.detach(director);
 
assertThat(session.contains(director)).isFalse();
assertThat(session.contains(task)).isFalse();

CascadeType.REFRESHve CascadeType.SAVE_UPDATEbeklediğimiz gibi çalışırlar - üst nesneyle gerçekleştirilen eylemleri bağımlı nesnesine kopyalarlar.

6.5 Yetim kaldırma seçeneği

Ayrıca bazen parametre ile karşılaşabilirsiniz orphan. Bu, Yetim kaldırmanın kısaltmasıdır. Ebeveyn varlıkları olmayan hiçbir alt varlık olmadığından emin olmak için kullanılır.

OneToOne(orphan = true)

Bu parametre true olarak ayarlanırsa alt varlık kaybolursa silinirtüm bağlantılar. ile tam olarak aynı değildir Cascade.REMOVE.

Birkaç ana varlığın bir çocuğa atıfta bulunduğu bir durumunuz olabilir. O halde, ana varlığın silinmesiyle birlikte silinmemesi, ancak ona yapılan tüm referansların geçersiz kılınması durumunda silinmesi faydalıdır.

Diyelim ki bir sınıfınız var:


@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL, orphan = true)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}


Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.tasks.get(0);
director.tasks.remove(task)
session.persist(director);
session.flush();

ÇalışanGörevi nesnesi silinecek çünkü ona referans kalmadı. Aynı zamanda kimse ana nesneyi silmedi.

6.6 getirme seçeneği

Getirme seçeneği, bağımlı nesnelerin nasıl yüklendiğini kontrol etmenizi sağlar. Genellikle iki değerden birini alır:

  • FetchType.LAZY
  • FetchType.EAGER

Bu, çeşitli tuzakları olan çok ilginç bir konu, bu yüzden bunun hakkında ayrı bir derste konuşsam iyi olur.