25 Mayıs 2014 Pazar

Hibernate Inheritance One Table Per Hierarchy (Hibernate Anotasyon ile)

Merhaba arkadaşlar,

Bir önceki yazımızda Hibernate teknolojisinde Inheritance konusuna değinmiş ve 3 farklı Inheritance durumundan bahsetmiştik. Bunlardan ilki olan Table Per Subclass konusunu bir önceki yazımda işlemiştik.
Bu hafta ise bir başka Inheritance durumu olan Table Per Hierarchy konusuna değineceğiz.

Table Per Hierachy, birden fazla tabloyu tek bir tablo olarak tutmamızı sağlıyor. Peki bu durum bizlere ne gibi avantajlar sağlıyor? Derinlemesine hiyerarşisi olan yani sayıca çok tablosu olan ve bu tabloları hiyerarşik olarak tek tabloda tutan bir veritabanında bir "Select" sorgusu ile o veriye daha kolay ve daha hızlı bir şekilde ulaşmamızı sağlar.

Şimdi bu yapıyı daha iyi anlamamız için örnek bir proje oluşturalım.
Çalışan ve Kişi adında iki tabloyu tek bir tabloda birleştirelim ve Kisi adında tek bir tablo oluşturalım.
Bu tabloya Çalışan ve Kişi tablolarının attribute değerlerini yazalım. Tablonun primary keyini belirleyelim ve son olarak bu tabloları ayırt etmemizi sağlayacak discriminator adında bir kolon ekleyelim.


Daha sonra java kısmına geçelim ve sınıflarımızı oluşturalım.

İlk olarak Kisi.java sınıfımızı oluşturalım.

Hibernate anotasyonlarını kullanarak tablomuzu, java sınıfımızla eşliyoruz. @Entity ve @Table anotasyonu ile veritabanında bulunan tablomuzu eşliyoruz. Bunlara ek olarak  @Inheritance anotasyonu ile inheritance durumunu belirtiyoruz. Bu örnekte tabloları tek bir tabloda birleştirdiğimiz için Inheritance tipimizi SINGLE_TABLE olarak belirttik. Tablolarımızı ayırt etmemiz için oluşturduğumuz discriminator adlı kolonumuzu @DiscriminatorColumn anotasyonunu ile belirtiyoruz. Ayırıcı olarak tabloların baş harfini kullandığımız için discriminator tipi olarak String yazıyoruz. Tablolarımızın baş harflerini ayırıcı olarak belirtmek içinse @DiscriminatorValue anotasyonunu kullanıyoruz. Daha sonra @Column anotasyonu ile veritabanımızda bulunan attributelerden Kişi adlı tablomuzun attribute değerlerine karşılık gelen kolonları belirliyoruz.

İkinci tablomuz olan Çalışan tablomuzun java sınıfını oluşturalım.
Calisan.java

Bu sınıfımız için de @Entity ve @Table anotasyonlarını kullanıyoruz ve table adı olarak tek tablomuz olan kisi tablomuzun adını veriyoruz. Bu tablomuzu ayırt etmemiz discriminator değerini @DiscriminatorValue anotasyonu ile belirliyoruz ve tablomuzun baş harfini değer olarak veriyoruz. Daha sonra Calisan tablomuza ait olan kolonlarımızı eşlemek için @Column anotasyonunu kullanıyoruz.

Daha sonra bu sınıflarımızın birer mapping class olduğunu hibernate.cfg.xml dosyamıza belirtiyoruz.


Tablolarımıza karşılık gelen sınıflarımızı oluşturduktan sonra üzerinde işlem yapacağımız Main.java sınıfımızı oluşturalım.

Main sınıfımızda, HibernateUtil sınıfımızdan bir session oluşturduk ve transaction başlattık. Daha sonra Kisi ve Calisan sınıflarımızdan birer obje oluşturduk ve session'a kaydettik. Son olarak değişikliklerin veritabanına yansıması için transaction'ı commit ettik.
Projemizi çalıştıralım ve veritabanımızdaki değişikliği gözlemleyelim.
Console ekranımızda yukarıdaki gibi bir görünüm oluşacaktır ve veritabanımıza aşağıdaki kayıtlar eklenecektir.
Böylece projemizi sonladırdık. Umarım bu yazım Hibernate Inheritance One Table Per Hierarchy konusunu daha iyi anlamanıza yardımcı olmuştur. Bir sonraki yazımda görüşmek üzere. Hoşçakalın.

Hiç yorum yok:

Yorum Gönder