23 Mayıs 2018 Çarşamba

JPA OneToOne İlişki

OneToOne İlişki
OneToOne ilişki tek veya çift yönlü olabilir.

Unidirectional İlişki
Örnek
Şöyle tanımlarız.
@Entity
@Table(name = Membership_Profile)
class MembershipProfile {
   Long moduleMembershipId;
   String displayName;
   // Other properties if needed
}
ve
@Entity
class PokerProfile {
   @OneToOne(fetch=FetchType.LAZY)
   @JoinColumn(name = "membershipId")
   MembershipProfile membershipProfile;
   ...
}
PokerProfile nesnesi JoinColumn ile hangi membership profile nesnesini ile ilişkili olduğunu bilir.

Örnek
ForeignKeyvermek için şöyle yaparız.
@Entity
public class MediaAnalysis {

  @OneToOne
  @JoinColumn(
    name = "MED_ID",
    nullable = false,
    foreignKey = @ForeignKey(name="MEA_MED_FK")
  )
  private Media media;
  ...

}

Bidirectional İlişki
Örnek'te bir kişi ve ehliyeti var. Yine mappedBy ile diğer sınıftaki alanı veriyoruz.
@Entity
@Table(name = "PERSON")
public class Person {
    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
    private DrivingLicense drivingLicense;
}

@Entity
@Table(name = "DRIVING_LICENSE")
public class DrivingLicense {
    @OneToOne
    @JoinColumn(name = "PERSON_ID", unique = true)
    private Person person;
}
OneToOne İlişki ve orphanRemoval = true
Yukarıdaki örnekte Person nesnesinin DrivingLicense alanı null yapılırsa DrivingLicense nesnesi de silinir.

cascade Alanı
1. CascadeType.ALL Değeri
CascadeType.All eğer Person nesnesi silinirse ona bağlı olan DrivingLicense nesnesinin de otomatik olarak silinmesini sağlar. Ancak orphanRemoval'dan biraz farklıdır. orphanRemoval ile drivingLicense alanını null yapsak bile ehliyet nesnesinin silinmesi sağlanır. 

CascadeType.All ile drivingLicense alanını null yaparsak aradaki bağı biz koparttığımız için DrivingLicense nesnesi veritabanında kalır yani silinmez.


Not : Eğer session.delete(entity); yaparsak DrivingLicense nesnesini silmeye çalışırsak  "org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)" hatasını alırız.

Bu hatanın sebebi OneToOne olan bir ilişkinin tek tarafını kırmaya çalışmamızdan kaynaklanıyor.

Çözüm olarak OneToMany ilişki kullanılması yeterli.

mappedBy Alanı
Açıklaması şöyle. Eğer unidirectional ilişki varsa önce kaydedilmesini istediğimiz sınıfa yazarız.
Optional) The field that owns the relationship. This element is only specified on the inverse (non-owning) side of the association.


Hiç yorum yok:

Yorum Gönder