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.PERSIST
ana 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.MERGE
veritabanı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.REMOVE
veritabanındaki bir üst nesneyi silersek, aynısının onun bağımlı nesneleri için de yapılması gerektiği anlamına gelir.
CascadeType.DELETE
Aynı anlamındadır. Bunlar eş anlamlıdır. Sadece farklı özelliklerden.
CascadeType.DETACH
ana 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.REFRESH
ve CascadeType.SAVE_UPDATE
beklediğ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.