16 Nisan 2020 Perşembe

JPA orphanRemoval Alanı

Giriş
JPA nesnelerini silmek için 4 tane yol var.
1. EntityManager.remove()
2. Cascading Remove
3. Orphan Removal
4. DELETE Queries

Bu yazıda 2 ve 3 numaralı maddeler anlatılıyor

orphanRemoval Hangi Tür İlişkilerde Kullanılır
Bu alan sadece @OneToOne ve @OneToMany ilişkilerde kullanılır. 

orphanRemoval + CascadeType.REMOVE Olabilir mi ?
Normalde bu anotasyonla beraber CascadeType.REMOVE kullanmaya gerek yoktur. Çünkü bu anotasyon zaten CascadeType.REMOVE işlevini içerir.

CascadeType.REMOVE ile Farkı Nedir?
CascadeType.REMOVE varsa, eğer parent nesne silinirse, child/dependent nesne de silinir. Açıklaması şöyle. Ancak bu seçenek child nesneye null değeri atarsak veya başka bir child nesne ile değiştirirsek devreye girmez
... indicates that remove operations should be cascaded automatically to entity objects that are referenced by that field
Bu yeteneği de istiyorsak orphanRemoval=true  kullanmak gerekir. Açıklaması şöyle. Yani bu seçenek ile başı boş kalan dependent nesne de otomatik olarak silinir.
The difference between the two settings is in the response to disconnecting a relationship. For example, such as when setting the address field to null or to another Address object.

- If orphanRemoval=true is specified the disconnected Address instance is automatically removed. This is useful for cleaning up dependent objects (e.g. Address) that should not exist without a reference from an owner object (e.g. Employee).

- If only cascade=CascadeType.REMOVE is specified no automatic action is taken since disconnecting a relationship is not a remove operation.
orphanRemoval Alanının Varsayılan Değeri Nedir?
Bu alanın FALSE varsayılan değer ile başlar. Açıklaması şöyle
The orphanRemoval attribute in @OneToMany and @OneToOne takes a Boolean value and is by default false.
Örnek - OneToOne
Şöyle yaparız
@Entity
class Employee {

  @OneToOne(orphanRemoval = true)
  private Address address;
  ...
}
Örnek  - OneToMany
Şöyle yaparız.
@Entity
public class Employee {

  @OneToMany(mappedBy = "employee", orphanRemoval = true)  
  private List<Address> addressList;
  ...
}
Örnek
CascadeType.REMOVE dışında diğer Cascade işlemlerini de istiyorsak şöyle yaparız.
@Entity
public class Employee {

  @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true)  
  private List<Address> addressList;
  ...
}

Hiç yorum yok:

Yorum Gönder