Hibernate

Hibernate 3 – @Embedable, @Embeded, @ElementCollection, @CollectionTable

Merhaba arkadaşlar, yazımıza kaldığımız yerden devam ediyoruz.

Dersimizden önce şunu demek istiyorum.  Yazılarımı olduğunca basit düzeyde yazıyorum.  Hibernate yeni başlayan kişiler için ağır ve anlam karmaşası yaratacak terimler kullanmak yerine o an aklımdan bu yazı ile ilgili ne geçiyorsa ona göre yazıyorum.  Eğer daha detaylı öğrenmek isterseniz Levent hocamızın ‘injavawetrust’ bloguna bakmanızı tavsiye ederim.

Bu hafta tablolar arasındaki ilişkileri işleyeceğiz.

İlk örneğimize başlayalım o zaman 🙂

Bu örneğimizde @Embedable – @Embeded annotations(dipnot) işleyeceğiz.

@Embedable – @Embeded nedir?  

Bu dipnotları şöyle düşünebiliriz. Her tabloda ortak kullanacağımız sütunları bir @Embedable sınıfında tanımlıyoruz ve ihtiyacımız olan propertyleri/instance veriable’leri başka tablolara ekliyoruz.

Şöyle bir örnek verebilirim.

Diyelim ki bir Öğretmen, Öğrenci, Mühendis tablolarımız var. Bunların hepsinin ortak özellikleri nedir? Hepsinin bir adı, soyadı ve  yaşı var. Biz bunların ortak özelliği olan property’leri @Embedable sınıfında tanımlarsak ve bunu da ihtiyacımız olan sınıflarda @Embeded dipnotu kullanarak tabloya gömebiliriz.

 

Şimdi nasıl kullanıldığına bakalım..

 

1.RESİM

Resimde de görüldüğü gibi @Entity dipnotu yerine burada @Embedable annotation’u kullandık. Bu sınıfın artık gömülebilir sınıf olduğunu belirtmiş olduk.

Kodlarımız ise ;

 

 

Şimdi ise People sınıfı gömeceğimiz sınıfa geliyoruz. Ben Students.class içine gömdüm sizde başka örnekler yapabilirsiniz.

 

2.RESİM

 

Resimde de görüldüğü üzere People class’ın nesnesini oluşturduk ve üzerinde de @Embeded dipnotunun tanımladık. Burada artık People class’ının özelliklerini buraya da vermiş olduk.

Kodlarımız;

 

People sınıfını birde teacher sınıfımıza gömüyoruz.

3.RESİM

Resimde görüldüğü gibi People sınıfımızın ortak kullanacağımız özelliklerini birden fazla tabloya gömebiliyoruz. Peki bize ne faydası oldu her tabloda name, surname, year tanımlamak yerine bir sınıf ta tanımladık ve ihtiyacımız gerektiğinde @Embeded dipnotunu kullanarak gömme işlemi yaptık.

Kodlarımız ise;

 

Sıra geldi ‘hibernate.cfg.xml’ dosyamıza burada oluşturduğumuz @Entity’leri orada tanıtmamız gerekiyordu. Bu örneğimizde üç sınıf kullandık. İki tanesi @Entity bir tanesi ise @Embedable kullandık. Biz sadece @Entity’leri hibernate.cfg.xml dosyamızda tanımlıyoruz. Hangi classlar tablolanacaksa o sınfıların ismini veriyoruz.

hibernate.cfg.xml dosyamızın kodları ise ;

 

ilk dersimizde ‘hibernate.cfg.xml’ dosyasından bahsetmiştik.

Burada  oluşturduğumuz @Entity’leri burada bildirmiş olduk.

 

Main methodumuzun bulunduğu sınıfta ise;

 

4.RESİM

 

 

 

Bu resimde de görüldüğü gibi ben 5 tane kişi nesnesi oluşturdum ve bu nesneleri Student ve Teacher sınıfında oluşturduğum constructor’lara parametre olarak gönderdim.

Ve veritabanımıza kaydedilecek olan nesneleri, ‘session’ nesnesini kullanarak ekleme işlemi yaptım.

Kodlarımız ise;

 

Uygulamamızı çalıştırdığımızda ise;

 

5.RESİM

 

Resimde de görüldüğü gibi iki tablo oluştuğunu görmekteyiz. Birinci örneğimizi bitirdik.

Şimdi yeni bir maven projesi açıyoruz. İlk dersimizde nasıl açılacağını detaylı bir şekilde anlattım.  Gerekli Jar dosyalarını da ekledikten sonra ilişkilere devam edelim.

 

Bu örneğimizde @ElementCollection‘dan bahsedeceğim. Bunu şöyle düşünebiliriz.

Bir kişinin birden fazla ’email’ adresi yada telefon numarası olabilir. Biz bu verileri aynı topla da tutmayız farklı bir tablo oluşturur oraya o kişinin foreign key’ini veririz. Şuan belki tam anlaşılır değil ama örneğimizi yaptıktan sonra mantığınıza oturacaktır.

Yeni bir proje açmıştık. Bu örneğimizde yeniden Student Class açıyoruz ve @Entity olarak tanımlayıp ‘hibernate.cfg.xml’ dosyamızda bildiriyoruz.

Şimdi Student sınıfımıza bakalım;

6.RESİM

Burada List yapısını birden fazla numara ve email için kullandık ve içine ekleyeceğimiz verilerin type String dedik.

Üzerinde de @ElementCollection dipnotunu tanımladık. Burada bize başka bir tablo oluşturup List’in içindeki verileri oraya ekleyeceğimi belirttik ve her @ElementCollection için yeni bir tablo oluşturuyor.

 

Kodlarımız;

 

 

Main methodumuzun bulunduğu sınıfa bakalım.

Burada 2 tane List oluşturuyoruz ve bu listlerin nesnelerini Student sınıfımızdaki constructor’a parametre olarak yolluyoruz.

 

7.RESİM

 

Resimde de görüldüğü üzere 2 tane list oluşturup parametre olarak gönderdik.

Kodlarımız;

 

 

 

Uygulamamızı çalıştırdığımızda ise 3 tane tablo oluştuğunu görmekteyiz. Student , student_emails ve students_phonenumbers şeklinde.

 

8. Resim

 

Peki oluşturduğumuz tabloların adlarını nasıl değiştireceğiz.

Bunun içinde yeni bir dipnot kullanıyoruz.

@CollectionTable(name = “TABLO ADI” , JoinColumn = @JoinColumn(name = “FOREIGN KEY ADI”) şeklinde tanımlıyoruz.

Yukararıdaki örneğimiz de ufak bir değişiklik yapıyoruz.

 

Bu şekilde tanımladığımızda tablomuzun isimleri ve oraya eklediğimiz foreign key isimleri değişmektedir.

@Column dipnotuyla da emails column’un adını değiştirdik.

 

Bu yazımı burada sonlandırıyorum. Önümüzdeki hafta ilişkilere kaldığımız yerden devam edeceğiz. Kolay gelsin 🙂

 

 

Dumlupınar Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği 3.sınıf öğrencisiyim.
Bir Java aşığı olarak Java teknolojileri üzerinde kendimi geliştiriyorum.
Adana’lıyım