Java persistence api – cascade stratejileri

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.

 

cascadecopy

 

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.

TipTanı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 

 

Şərh