JPA – Cascade Stratejileri
Cascade JPA içerisinde stratejileri nesneler arasındaki persist operasyonların birlikte davranışlarını belirler. Bunun anlamı bağlı olduğunuz nesnenin aynı persist operasyonundan geçip geçmemesidir.
Örnek verecek olursak aşağıdaki gibi bir entity yapımız olsun.
Buna göre Student ve Address arasında OneToOne bir ilişki bulunmaktadır ve kod aşağıdaki gibidir.
Student Entity
Address Entity
Yukarıdaki entity mimarisine aşağıdaki gibi bir işlem yapalım.
Bu durumda aşağıdaki gibi bir hata oluşacaktır.
Hatanın asıl nedeni aşağıdaki gibi.
Bunun nedeni Student içerisinde bulunan adresin student ile birlikte kaydedilmesi ancak address in kayıtlı bir nesne olmamasıdır. Yani buradaki nesne managed değil transient durumda beklemektedir.
Bu çözmek için iki yöntemimiz bulunuyor. Birincisi aşağıdaki gibi Student entity sini kaydetmeden önce Address i kaydetmektir.
Ancak birden fazla bağlayıcılığı olan entity lerde bu durum karmaşıklığa neden olabilir. Bu durumda Cascade stratejilerini kullanabiliriz.
Aşağıdaki örnekte Student -> Address ilişkisinde PERSIST tipinde bir cascade stratejisi verilmektedir.
Bu durumda Student tipindeki entity nesnelerinde bir persist operasyonu gerçekleşirse Address içinde aynı operasyon yapılacaktır. Yani entityManager.persist(student) dediğimiz anda iki adet insert cümleciği olacaktır.
Bunun haricinde Cascade tipleri persist, merge, remove, refresh ve all şeklinde de verilmektedir.
| Tip | Tanım |
|---|---|
| PERSIST | Nesne persist edilirse alt nesne de persist edilir |
| MERGE | Nesne merge edilirse alt nesne de merge edilir |
| REMOVE | Nesne silinirse bağlı alt nesne de silinir |
| REFRESH | Nesne yenilenirse bağlı alt nesne de yenilenir |
| ALL | Tüm işlemler birlikte yapılır |
Buna göre stratejiyi örnek olarak REMOVE verecek olursak Student nesnesinden bir kayıt sildiğimizde ilişklili adresi de silinecektir.
ALL tüm işlemler için geçerlidir tüm özellikleri taşır. Ancak tamamının olmasını istemiyorsak ve sadece PERSIST ve MERGE operasyonlarının birlikte yapılmasını düşünüyorsak bu durumda aşağıdaki gibi birden fazla tanımı kullanabiliriz.
Not : Silme işlemlerinde Cascade kullanımlarına dikkat ediniz. Bunları manuel yapmamızda fayda var.

Son Yorumlar