Java Persistence API – Cascade Stratejileri
Cascade JPA içerisinde stratejileri objeler arasındaki persist operasyonların birlikte davranışlarını belirler. Bunun anlamı bağlı olduğunuz nesnenin aynı persist operasyonundan geçip geçmemesidir.
Buna göre Customer ve CustomerDetail arasında OneToOne bir ilişki bulunmaktadır ve kod aşağıdaki gibidir.
Customer.java
1 2 3 4 5 6 7 8 9 10 11 12 |
@Entity public class Customer implements Serializable { @Id @GeneratedValue private Long id; private String firstName; private String lastName; @OneToOne private CustomerDetail detail = new CustomerDetail(); } |
CustomerDetail.java
1 2 3 4 5 6 7 8 9 |
@Entity public class CustomerDetail implements Serializable { @Id @GeneratedValue private Long id; private Double salary; private String citizenNumber; } |
Şimdi varsayalımki Persistence unitimizi ayarladık ve bi insert işlemi yapalım bu entity’ler üzerinden,
1 2 3 4 5 |
Customer customer = new Customer(); customer .setFirstName("Ahmet"); customer .setLastName("KILIÇ"); customer .getDetail().setCizitenNumber("12345678901"); entityManager.persist(customer ); |
Bu durumda bir hata oluşacaktır.Bunun nedeni Customer içerisinde bulunan citizienNumber’in customer ile birlikte kaydedilmesi ancak detail’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 Customer entity sini kaydetmeden önce CustomerDetaili’i kaydetmektir.
1 2 3 4 5 6 |
Customer customer = new Customer (); customer.setFirstName("Ahmet"); customer.setLastName("KILIÇ"); customer.getDetail().setCizitenNumber("12345678901"); entityManager.persist(customer.getCizitenNumber()); entityManager.persist(customer); |
Böyle bir çözüm vardır ama birden fazla ilişkili nesnesi olan entitylerde karmaşıklığa neden olabilir bu durum.Onun için bu sorunu Cascade stratejilerini kullanarak düzeltebiliriz.
Örneğimizde Customer -> CustomerDetail ilişkisinde PERSIST tipinde bir cascade stratejisi verilmektedir.
1 2 |
@OneToOne(cascade = CascadeType.PERSIST) private CustomerDetail detail = new CustomerDetail(); |
Bu durumda : Customer tipindeki entity nesnelerinde bir insert işlemi gerçekleşirse CustomerDetail içinde aynı işlem gerçekleşecektir . Yani entityManager.persist(customer ) 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 |
Umarım yararlı olmuştur.
İyi Çalışmalar 🙂