Bu yazımda Hibernate teknolojisinde Inheritance konusuna değineceğim. Hibernate bizlere Inheritance(Kalıtım) konusunda 3 farklı yaklaşım sunuyor:
- Table Per Subclass
- Table Per Class Hierarchy
- Table Per Concrete Class
Table Per Subclass durumu için veritabanında bulunan bir tablo süper classa denk gelir, diğer tablolar da bu süper classtan türeyen alt sınıflara denk gelir. Alt sınıflar süper sınıfın primary keyi ile süper sınıfa bağlıdır. Şimdi bu durumu örnekleyen uygulamamıza geçelim.
Öncelikle veritabanı tablolarımızı oluşturarak işe başlayalım. Bu uygulama için Araç, Otobüs ve Kamyon adında üç tablo oluşturacağız. Bu tablolardan Otobüs ve Kamyon tabloları Araç tablosuna kalıtım yoluyla bağlı olacaktır.
Sırasıyla Araç, Otobüs ve Kamyon tablolarını ve bu tabloların attribute değerlerini oluşturalım.
CREATE TABLE `galeri`.`arac` (
`arac_id` INT NOT
NULL AUTO_INCREMENT,
`firma` VARCHAR(45)
NULL,
PRIMARY KEY
(`arac_id`));
Galeri adında yeni bir veritabanı ve araç adında yeni bir tablo oluşturduk. Bu tablonun attribute değerleri olarak arac_id ve firma değerlerini belirledik.
Daha sonra Otobüs tablomuzu ve attribute değerlerini oluşturalım.
CREATE TABLE `galeri`.`otobus` (
`arac_id` INT NOT
NULL,
`seri` VARCHAR(45)
NULL,
`yıl` INT NULL,
`kisi_sayisi` INT
NULL,
PRIMARY KEY
(`arac_id`),
CONSTRAINT `FK_ARAC` FOREIGN KEY
(arac_id) REFERENCES
`galeri`.`arac` (arac_id)
ON DELETE NO
ACTION
ON UPDATE NO
ACTION);
Otobüs tablosunun attributelerini ise arac_id, seri, yıl ve kisi_sayisi olarak belirledik. arac_id attribute'unun Arac tablosunundan geldiğini ve bu tablo için de primary key olduğunu belirttik.
Son olarak Kamyon tablosunu da oluşturalım ve uygulamamızın Hibernate kısmına geçelim.
CREATE TABLE `galeri`.`kamyon` (
`arac_id` INT NOT
NULL,
`model` VARCHAR(45)
NULL,
`kapasite_ton` INT
NULL,
PRIMARY KEY
(`arac_id`),
CONSTRAINT
`FK_ARAC1`
FOREIGN KEY
(arac_id) REFERENCES
`galeri`.`arac` (arac_id)
ON DELETE NO
ACTION
ON UPDATE NO
ACTION);
Tablolarımızı oluşturduktan sonra bu tablolara karşılık gelen java sınıflarını oluşturalım. Eşleme yaparken Hibernate anotasyonlarını kullanalım.
Arac tablosuna karşılık gelen Arac.java sınıfını oluşturalım.
Anotasyonlar kullanarak eşleme yapmayı daha önceki konularımızda görmüştük. Burada @Inheritance adında yeni bir anotasyon kullanarak inheritance durumunu belirteceğiz. @Inheritance anotasyonunu ve bu anotasyonun strategy attribute'unu kullanarak süper classın inheritance durumunu belirtiyoruz.
Daha sonra Arac sınıfından türeyen Otobus.java sınıfını oluşturalım.
Otobüs tablosuna karşılık gelen Otobüs.java sınıfı yukarıdaki gibi oluşturuyoruz ve Arac sınıfından extend ediyoruz. Tabloda karşılık gelen alanları anotasyonlarla belirtiyoruz. Burada bu sınıfın süper class ile bağlantısının primary key aracılığı ile olduğunu belirtmek için @PrimaryKeyJoinColumn anotasyonunu kullanıyoruz.
Şimdi de Kamyon tablomuza karşılık gelen Kamyon.java sınıfını oluşturalım.
Bu sınıfta da Otobüs.java sınıfında olduğu gibi süper classla bağlantısını belirtmek için @PrimaryKeyJoinColumn anotasyonunu kullanıyoruz. Bu sınıfı da Arac sınıfından extend etmeyi unutmuyoruz.
Java sınıflarımızı oluşturduktan sonra her zaman yaptığımız gibi bu sınıfları Hibernate konfigürasyon dosyamız olan hibernate.cfg.xml dosyamıza aşağıdaki gibi kaydediyoruz.
Son olarak bu sınıfları kullanabileceğimiz, üzerinde işlem yapabileceğimiz Main.java sınıfımızı oluşturuyoruz.
Main sınıfımızda ise her zaman yaptığımız gibi HibernateUtil sınıfını kullanarak yeni bir Session oluşturuyoruz. Daha sonra işlemlerimizi gerçekleştirerek veritabanımıza etki edecek olan transaction objemizi oluşturuyoruz.
Daha önceden oluşturduğumuz Araç, Otobüs ve Kamyon sınıflarından obje oluşturuyoruz. Bu oluşturduğumuz objeleri Session'ımıza kaydediyoruz ve işlemlerimizin veritabanını etkilemesi için transaction'ınımızı commit ediyoruz.
Bu transaction sonucunda Volvo, Mercedes, Neoplan ve Renault firmalarına ait araçlarımız oluşacaktır. Mercedes firmasına ait Travego adlı otobüsün yanı sıra Neoplan firmasına ait Starliner adlı otobüs ve bu otobüslerin bilgileri veritabanına işlenecektir. Ve son olarak Renault firmasına ait T440 modelinde yeni bir kamyon bilgisi veritabanına yazılacaktır.
Bu yazımda sizlere Hibernate teknolojisinde Table Per Subclass Inheritance konusundan bahsettim ve örnek uygulama oluşturarak bu inheritance durumunun nasıl olduğunu görmüş olduk.
Bir sonraki yazımda görüşmek üzere...
Referanslar:
Hiç yorum yok:
Yorum Gönder