İçeriğe geç

Hibernate – @OneToOne

@OnetoOne anotasyonu entity içinde entity kullanılıyor ve aralarında da birebir ilişki var ise kullanılır. Insan ve Parmak izi diye iki nesnemizin olduğunu düşünelim. İnsan tablosu içinde Parmak izi tablosuna join yapmak istersek, aralarındaki ilişki birebir olduğuna göre, bu tabloların entitylerini yazarken, join yaptığımız yerde OnetoOne anotasyonu kullanılmalıdır.

6 farklı özellik sunar.

  • fetch
  • cascade
  • mappedBy
  • optional
  • orphanRemoval
  • targetEntity

Fethc ile sorgu çekildiğinde join yapılan kolonun da tamanınım getirilip getirilmemesi belirlenir. Default olarak EAGER gelir. Sürekli birlikte kullanılacak tablolar olmadığı sürece EAGER yapılmamalıdır.

– Cascade ile cascade tipini belirtiriz. 6 farklı cascade tipi vardır. Aslında 5 tip vardır ama 6. tip olan All bu diğer 5 işlemi yapar.

Bu tipler:

  • detach
  • merge
  • persist
  • reflesh
  • remove
  • all

CascadeType.REMOVE seçersek, bu nesne silindiğinde diğer nesne de silinir ya da CascadeType .MERGE seçersek merge edildiğinde diğer nesne de merge edilir. Tüm işlemlerin diğer nesnede de yapılması istenirse CascadeType.ALL seçilir ve silinirse silinir, kaydedilirse kaydedilir.

mappedBy çift yönlü ilişklilerde kullanılır. Verdiğim örnekte Kisi nesnesinde ParmakIzi ve ParmakIzi nesnesinde de kişi var. mappedBy kullanılırsa kullanıldığı entity deki alan için database de alan oluşmaz ama entity üzerinde tutulur (Sanki @Transient kullanılmış gibi düşünebiliriz). Resimlerdeki örneklerde de görüleceği üzere, kişi üzerinde mappedBy kullanılmış. Bu demek oluyor ki, database deki kişi tablosunda parmak izi kolonu yok ama kişi entity sinde parmak izi kolonu var.

optional ile aradaki ilişki zorunlu mu değil mi bu belirlenir. Default true dur. Yani istenirse boş geçilebilir fakat false yaparsak arada bir ilişki kurulması yani bu alanın dolduurulması şart olur.

orphanRemoval true olursa ve join yaptığımız alanı değiştirip kaydedersek, kaldırılan alan databaseden silinir.

targetEntity: İlgili joine ilişkin referans sınıfın belirtilmesine yarar. Normalde gerekmez çünkü referans sınıf zaten

alanın tipinden () (private String adi; -> alanın tipinin string olduğu anlaşılır)
get() metotdundan (public String getAdi() -> alanin tipinin string olduğu anlaşılır)
ya da collections ların generic tipinden (private List<String> adiListesi; -> Liste tipinin string olduğu anlaşılır)
alınabilir.

Fakat bazı durumlarda bunların hiçbirine ulaşılamaz. Örneğin,

public list kisiListesi;

diye bir listemiz olsun ve bu listenin generic olarak bile bir türü belirtilmemiş olsun. Bu durumda target entity ile Kisi.class deriz ve belirtmiş oluruz.

Tarih:Hibernate

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir