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.
25 Mayıs 2014 Pazar
11 Mayıs 2014 Pazar
Hibernate Inheritance One Table Per Subclass (Hibernate Anotasyon ile)
Merhaba arkadaşlar,
Bu yazımda Hibernate teknolojisinde Inheritance konusuna değineceğim. Hibernate bizlere Inheritance(Kalıtım) konusunda 3 farklı yaklaşım sunuyor:
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:
4 Mayıs 2014 Pazar
Hibernate Annotations ile many-to-one association
Merhaba arkadaşlar,
Geçen hafta Hibernate anotasyonlarından bahsetmiştik. Bu hafta Hibernate anotasyonlarını kullanarak örnek bir proje oluşturacağım.
Öncelikle projemizde kullanacağımız Isci ve Departman adındaki tablolarımızı MySQL Workbench' de oluşturuyoruz.
Isci tablosunu ve attribute'lerini aşağıdaki gibi oluşturuyoruz.
Geçen hafta Hibernate anotasyonlarından bahsetmiştik. Bu hafta Hibernate anotasyonlarını kullanarak örnek bir proje oluşturacağım.
Öncelikle projemizde kullanacağımız Isci ve Departman adındaki tablolarımızı MySQL Workbench' de oluşturuyoruz.
Isci tablosunu ve attribute'lerini aşağıdaki gibi oluşturuyoruz.
Tablolar arasındaki ilişkimiz many-to-one olduğundan dolayı one taraf olan yani Departman tablosunun primary keyini many taraf olan Isci tablosuna foreign key olarak ekliyoruz.
Isci tablomuzu oluşturduktan sonra Departman tablomuzu ve attribute'lerini aşağıdaki gibi oluşturuyoruz.
Tablolarımızı oluşturduktan sonra içlerine birkaç veri ekliyoruz.
Verileri girerken many-to-one ilişkimize dikkat ediyoruz. Bu ilişkide aynı departmanda birden fazla işçi çalışabilir ve bir işçi sadece bir departmanda çalışabilir.
Tablolarımızı oluşturduktan sonra java sınıflarımızı oluşturacağız.
Isci tablosuna karşılık gelen Isci.java sınıfımızı aşağıdaki gibi oluşturuyoruz.
Veritabanımızda oluşturduğumuz Isci tablosunun adını ve sütunlarını bu sınıf içerisinde belirtiyoruz.
Tablo adını @Table(name="isci") anotasyonuyla belirtiyoruz. Tablo sütunlarını ise @Column(name="ad") anotasyonu ile belirtiyoruz. Tablomuzun primary keyini ise @Id, @GeneratedValue ve @Column(name="isciID") anotasyonları ile belirtiyoruz. Many-to-one ilişkisini @ManyToOne anotasyonu ve Departman tablosundan gelen foreign key departmanID'yi @JoinColumn(name="departmanID") anotasyonu ile belirtiyoruz.
Daha sonra Isci sınıfımızın default constructor'ını ve parametreli constructor'ını yazıyoruz. Ve son olarak tablomuzun sütunlarının getter&setter methodlarını yazıyoruz.
Isci.java sınıfımızı oluşturduktan sonra Departman tablomuza karşılık gelen Departman.java sınıfımızı oluşturalım.
Departman sınıfımızı yukarıdaki gibi oluşturduktan sonra ana sınıfımız olan Main.java sınıfını oluşturalım ve üzerinde işlem yapalım.
Session factory oluşturmak için HibernateUtil.java sınıfını kullanıyorduk bu projemize onu da dahil ediyoruz.
Main sınıfımızda session oluşturup, transaction başlatıyoruz. Daha sonra Departman sınıfımızdan obje oluşturup, setDepartmanAdi() methodunu kullanarak "Ulastirma" adında yeni bir departman oluşturuyoruz.
Daha sonra oluşturduğumuz bu objeyi sessiona kaydediyoruz.
Yeni bir Isci oluşturmak için ise Isci sınıfımızdan obje oluşturup constructorına ilgili değerleri yazıyoruz. Bu yolla Ali Akyüz ve Mehmet Öztürk adında iki yeni işçi oluşturuyoruz. Oluşturduğumuz bu işçilere daha önceden oluşturduğumuz "Ulaştırma" departmanına kaydediyoruz. Daha sonra yaptığımız bu değişiklikleri veritabanına göndermek için transaction.commit() komutunu kullanıyoruz.
Sonraki adım olarak oluşturduğumuz sınıfları hibernate configuration dosyamıza belirtiyoruz.
hibernate.cfg.xml
Ve artık projemizi çalıştırabiliriz. Sonuç olarak Ali Akyüz ve Mehmet Öztürk adında iki yeni işçi ve Ulaştırma adında yeni bir departman oluşacak ve bu iki işçi Ulaştırma deparmanına atanacaklardır.
Bugün Hibernate anotasyonlarını kullanarak nasıl many-to-one ilişki oluştulur örnek proje üzerinde görmüş olduk. Haftaya bir başka konu ile birlikte olacağız. Takipte kalmayı ihmal etmeyiniz...
Kaydol:
Kayıtlar (Atom)