İçeriğe geç

Hibernate – @OneToMany

@OneToMany anotasyonu entity içinde entity kullanılıyor ve aralarında da bire çok bir ilişki var ise kullanılır.

Şehir ve Ulke diye iki nesnemizin olduğunu düşünelim. bir ülkenin birden fazla şehri olur fakat bir şehrin birden fazla ülkesi olmaz.

Ulke tablosu içinde Sehirler listesine join yapmak istersek. Aralarındaki ilişki bire çok olduğuna göre, bu tabloların entitylerini yazarken, Ulke entity si içinde şehirler listesinde OneToMany anotasyonu kullanılmalıdır.

5 farklı özellik sunar.

  • fetch,
  • cascade
  • mappedBy
  • orphanRemoval
  • targetEntity

fetch 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 fetchtype lazy yapılmalıdır. –

cascade ile cascade tipini belirtiriz. 6 farklı cascade tipi vardır.

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. Örneğimizde Ulke nesnesinde sehirler listesi var. mappedBy kullanılırsa kullanıldığı entity deki alan için database de ilişki tablosu oluşmaz ama entity üzerinde bu ilişkiler var olur. Ulke nesnesi üzerindeki sehirler için mappedBy kullanılmış. Bu demek oluyor ki, database de Ulke-Sehir diye bir ilişki tablosu oluşmayacak. İlişkiler  sadece sehir üzerindeki ulkelerde tutulacak. Ama mappedBy kullanılmazsa, ulke-sehir adında bir ara tablo oluşturulacak.

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, get metotdundan ya da collections ların generic tipinden alınabilir.

Fakat yandaki örnekte de görülebileceği üzere, public set sehirler diye tanımladığımız durumlarda, bu listenin generic olarak bile bir türüne ulaşılamaz.

Bu durumda target entity ile Sehir.class yazarız ve türünün 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