Hibernate ve JPA tarafında Inheritance Kullanımı

Inheritance yani kalitim object oriented dünyasının önemli parçalarından biridir. Bu konu JPA tarafında da önemli bir yer teşkil etmektedir. Peki JPA ile entity tasarlarken inheritance bunun neresinde kaliyor ?
Model tasarimlarimizda kalitim kullandigimizda ornegin bir ogrenci bilgi sistemi tasarladigimizda bunun icerisinde 2 tip insan oldugunu varsayalim. Bunlar Ogrenci ve Ogretmen entityleri olsun. Bu entitylerin ortak bir yanlari var insan olmalari yani insana ait tum ozellikleri almalari. Bu durumda biz Insan adinda bir sinif yaratip diger entityleri bundan turetebiliriz.
Bu durumda entity iceriklerim asagidaki gibi olur.

Insan.java

    @Entity
    public class Insan implements Serializable {
     private static final long serialVersionUID = 1L;
     
     @Id
     @GeneratedValue
     private Long id;
     private String ad;
     private String soyad;
     
     //get ve set metodlari…
    }

Ogrenci.java

    @Entity
    public class Ogrenci extends Insan {
     
     private Integer ogrenciNo;
     private String bolum;
     
     //get ve set metodlari…
    }

Ogretmen.java

    @Entity
    public class Ogretmen extends Insan  {
     
     private Integer sicilNo;
     private String brans;
     
     
     //get ve set metodlari…
    }

Peki bu tasarımın veri katmanında yani database tarafında tutulma şekli nedir ? Bu defult strateji olan single table dır. Yani tüm bilgiler Insan tablosunda tutulacaktır. Peki tüm bilgileri insan tablosunda tutlacak ise bunları ayrıştıracak şey nedir ? Buna discriminator diyoruz. Discriminator entity ler içerisinde hangi kaydin hangi entity tipine ait oldugunu belirler. Istersek entity ye ozel bir discriminator tanimi yapabilir veya discriminator value ataması yapabiliriz.

Inheritance ile ilgili diger stratejiler TABLE_PER_CLASS ve JOINED tanımıdır. TABLE_PER_CLAS stratejisinde her entity icin kendisine ozel bir tablo oluşturulur. Yani Ogrenci ve Ogretmen tabloları varken Insan tablosu yer almamaktadir. JOINED stratejisinde ise Insan ile ilgili bilgileri Insan tablosunda yer alirken diger entity bilgileri kendi tablolarinda yer almaktadir.

Strateji tanimlari ile ilgili örnek tanım aşağıda bulunmaktadır.

    @Entity
    @Inheritance(strategy=InheritanceType.JOINED)
    public class Ogrenci extends Insan {
     
    }
  1. gokceng
    Aug 20th, 2011 at 18:50 | #1

    teşekkürler

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>