Çok uzun zaman önce (1 yılı geçti) Hibernate’e Giriş başlıklı bir makale yazmıştım. Oldukça olumlu tepkiler almıştım. Özellikle devamı gelmesi gerektiği hakkında. Ama bir türlü zaman bulup devamını getiremedim. En nihayetinde bugun Hibernate ile Derinlemesine adlı bir yazı dizisine başlamış bulunmaktayım
Bu yazıda ( Yazı-1), Hibernate’e Giriş yazısında anlattığım xml dosyaları ile yapılan eşleştirme işlemi yerine daha basit bir şekilde aynı işlemleri yapan ama bizi xml dosyalarından kurtaran Hibernate Annotation’ı anlatacağım. Annotation ‘ı türkçe karşılığı dipnot olarak çevirebiliriz. Annotation Java’nın bize sağladığı süper bir araç. Annotation’lar sınıfımızdaki elamanlara @ işareti ile eklediğimiz bazı fonksiyonlar ve parametrelerinden oluşur. Bu tanımlamalar derleme anında derleyici tarafından yorumlanırlar.
Yazıyı gecen sefer netbeans üzerinden anlatmıştım , Bu seferde aynı şekilde netbeans’den devam edeceğim.
Hibernate’in web (www.hibernate.org) adresinden download bölümünden Hibernate Core ve Hibernate Annotation adlı paketleri bilgisayarımıza indirelim. Ben Hibernate Core 3.3.2.GA ve Hibernate Annotation 3.4.0.GA versiyonlarını indirdim.
Şimdi bu indirdiğimiz iki sıkıştırılmış dosyayı açtıktan sonra içlerinden bize gerekli olan jar dosyalarını ortak bir klasörde toplayalım. hibernate-distribution-3.3.2.GA içinden bize gerekli olan jar dosyaları şunlardır.
- hibernate3.jar
- lib/required/antlr-2.7.6.jar
- lib/required/commons-collections-3.1.jar
- lib/required/dom4j-1.6.1.jar
- lib/required/javassist-3.9.0.GA.jar
- lib/required/jta-1.1.jar
- lib/required/slf4j-api-1.5.8.jar
Yukarıdaki bu dosyaları ben masaüstümde hibernateLibs adında bir klasör oluşturarak bu klasörün içine kopyalayalım. Sonrasında Annotation için gerekli olan jar dosyalarını bu klasöre kopyalayalım. Bu dosyaslar ise ;
- hibernate-annotations.jar
- lib/hibernate-comons-annotations.jar
- lib/ejb3-persistence.jar
- test/slf4j-log4j12.jar
- test/log4j.jar
Bu dosyalarıda hibernateLibs klasörüne kopyaladıktan sonra artık kuru fasülyenin faydalarına gelebiliriz
Not: Yukarıdaki söylediğim jar dosyaları hibernate’in doğru çalışması için olan minumum gereksinim duyduğu kütüphanelerdir. Hibernate ile yapacağınız profesyonel projelerde hibernate, bunlar haricinde 3. parti ekstra kütüphanelere ihtiyaç duyabilir.
Öncelikle Netbeans’ı açıyoruz tabi. Sonrasında File->New Project menüsünden çıkan pencerede Java-> Java Application seçerekten en saf hali ile yeni bir java projesi oluşturuyoruz. Ben projenin adını tirtil koydum
Projenin ana paket yolu ise com.vizyon.arge.tirtil şeklinde. Bir ekran görüntüsü (ki ekran görüntüleri konuyu çok daha anlaşılır şekle getirmekte) vermek gerekirse görüntümüz saf haliyle böyle (Resim 1):
Şimdi projemize hibernate için gerekli olan kütüphaneleri dahil edelim. Bunun için sol kısımdaki proje ağacındaki Libraries’e sağ tıklayıp Add JAR/Folder… seçeneğini seçiyoruz. Karşımıza çıkan pencerede HibernateLibs klasörüne attığımız tüm jar dosyalarını ctrl yardımı ile hepsini seçiyoruz. Sonrasında Ok diyerek jar dosyalarının projemize dahil olmasını sağlıyoruz. bkz Resim 2
Hibernate ile ilgili kütüphanelerimizi ekledikten sonra mysql bağlantısını sağlayacak olan jdbc mysql connector jar’ınıda projemize ekliyoruz. Mysql jar’ınıda projemize ekledikten sonra kütüphane ekleme işlemi bitmiş oluyor. Sıra projemize hibernate.cfg.xml dosyamızı ekleme geldi. Bu konuyu Hibernate’e Giriş bölümünde anlattığım için es geçiyorum.
Hibernate.cfg.xml dosyamızıda ekledikten sonra şimdi sıra HibernateUtil sınıfımızı oluşturmaya geldi. Hibernate Annotation kullanırken Util sınıfımızda bazı değişiklikler yapacağız. Annotation kullanmadan önceki Util sınıfımız şu şekildeydi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class HibernateUtil { private static SessionFactory sessionFactory; static { try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch(Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } |
Annotation kullanacağımız için Util dosyamıza annotation kullandığımızı belirtemiz gerek. Hibernate de ona göre davranarak Entity sınıflarımızı xml yada annotation’lara göre bulacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class HibernateUtil { private static SessionFactory sessionFactory; static { try { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } catch(Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } |
Yeni HibernateUtil.java sınıfımız bu şekilde. Aradaki tek fark configurasyonun annotation kullanarak yapıldığını belirtemek
Bütün buraya kadar başarılı bir şekilde gelip gelmediğimizi görmek için projemize sağ tıklayıp Clean And Build seçeneğini tıkyın. Ben tıkladığımda console’da BUILD SUCCESSFUL (total time: 0 seconds) şeklinde bir mesaj aldım. Yani bu zamana kadar her hangi eksik bişey yapmamışız. Artık Entity sınıflarımızı oluşturmaya rahatlıkla geçebilriz
Entity sınıflarını ayrı bir paket altında tutmamız her zaman daha iyidir. Onun için öncelikle com.vizyon.arge.tirtil.entity şeklinde yeni bir paket oluşturuyorum. Şimdi entity sınıflarını oluşturacağız. Ben tirtil da basit şekilde uye bilgilerini tutan bir örnek ile devam edeceğim. Bundan sonraki yazılarda da bu ornek nesnelerde devam ederiz.
Öncelikle Uye.java sınıfımızı oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 | public class Uye { private int id; private String uyeAdi; private String sifre; private String mail; private String adi; private String soyadi; private String web; } |
şimdilik sadece bu bilgiler bize lazım olsun. İlerleyen yazılarda faha Uye.java sınıfımıza bir çok özellik ekleyeceğiz. Bu özellikleri ekledikten sonra hepsine birer getter ve setter eklememiz lazım. Tabi bunu el ile amelece (notpad kullananlar) yazmak yerine hızlı bir şekilde netbeans editörüne sağ tıklayıp Insert Code Seçeneğini seçiyoruz. Açılan küçük pencerede Getter And Setter seçeneği var. Onu seçerekten hızlı bir şekilde getter ve setter fonksiyonlarımızı oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | package com.vizyon.arge.tirtil.entity; /** * * @author kamil */ public class Uye { private int id; private String uyeAdi; private String sifre; private String mail; private String adi; private String soyadi; private String web; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAdi() { return adi; } public void setAdi(String adi) { this.adi = adi; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getSifre() { return sifre; } public void setSifre(String sifre) { this.sifre = sifre; } public String getSoyadi() { return soyadi; } public void setSoyadi(String soyadi) { this.soyadi = soyadi; } public String getUyeAdi() { return uyeAdi; } public void setUyeAdi(String uyeAdi) { this.uyeAdi = uyeAdi; } public String getWeb() { return web; } public void setWeb(String web) { this.web = web; } } |
Buraya kadar bir solukta geldik. Şimdi sıra, daha önce xml dosyalarımız ile yaptığımız veritabanı ile entity nesnemiz arasındaki eşleştirmeyi , annotation’ları kullanarak yapmaya. Basit olarak bir kaç tane annotation’nın ne işe yaradığını öncelikle açıklayayım. Daha sonrasnda bu annodation’ları sınıfımız üzerinde doğru yerlere serpiştiririz.
- @Entity : Sınıf tanımlamasının hemen bir üst satırına yazılır. O sınıfın bir entity sınıfı olduğunu belirtir. paket adresi javax.persistence.Entity;
- @Table : Sınıf tanımlamasının hemen bir üst satırına yazılır. O sınıfın hangi tablo ile eşleştiğini bildirir. name parametresi ile tablo adı belirtilir. paket adresi javax.persistence.Table;
- @Id : Tablodaki birincil ahantar olarak karşılığı bulunan sınıf değişkeninin getter fonksiyonunun hemen bir üst satırına yazılır. paket adresi javax.persistence.Id;
- GeneratedValue : Birincil ahantarın otomatik değer alma biçimini belirtir. mysql’deki auto_incrament’in karşılığıda diyebiliriz. oluşturma tipi strategy parametresi ile belirtilir. IDENTITY, SEQUENCE, TABLE, AUTO şeklinde 4 parametre alır. Mysql kullanacaklar IDENTITY seçmelidir. paket adresi javax.persistence.GeneratedValue;
- @Column : tablodaki alan ismini simgeler. name ile alan adı parametre olarak gönderilir. nullable parametresi ile boş bırakılabilir alan olup olamayacağı, length ile ise alanın büyüklüğü belirtilir. String türündeki bir değişken için @Column(name=”adi” , nullable = false, length = 25) şeklindeki bir tanımlama adi VARCHAR(25) NotNull ‘a karşılık gelir. Parametrelerin default değerleri vardır. Eğerki parametreyi tanımlamada kullanmazsanız default değerini alır. Örn: nullable parametresinin default olarak değeri true ‘dur.
Evet şimdilik buradaki tanıttığım annodationları Uye sınıfımıza serpiştirelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | package com.vizyon.arge.tirtil.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; /** * * @author kamil */ @Entity @Table(name="Uye", catalog="tirtil") public class Uye { private int id; private String uyeAdi; private String sifre; private String mail; private String adi; private String soyadi; private String web; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id", nullable=false) public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name="adi", nullable=false , length= 30) public String getAdi() { return adi; } public void setAdi(String adi) { this.adi = adi; } @Column(name="e_mail", nullable=false, length= 100) public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } @Column(name= "sifre", nullable=false,length=128) public String getSifre() { return sifre; } public void setSifre(String sifre) { this.sifre = sifre; } @Column(name="soyadi", length= 30) public String getSoyadi() { return soyadi; } public void setSoyadi(String soyadi) { this.soyadi = soyadi; } @Column(name="uye_adi", length=50) public String getUyeAdi() { return uyeAdi; } public void setUyeAdi(String uyeAdi) { this.uyeAdi = uyeAdi; } @Column(name="url") public String getWeb() { return web; } public void setWeb(String web) { this.web = web; } } |
Böylelikle tanımlamalarımızıda bitirmiş oluyoruz
Şimdi bu sınıfımızı HibernateUtil.java sınıfında AnnotatedClass olarak tanımlamalıyız. Bunu işlem xml ile yapılandırma yapar iken hbm dosyalarımızı hibernate.cfg.xml dosyasına eklediğimiz mantık ile aynı.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package com.vizyon.arge.tirtil.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; /** * * @author kamil */ public class HibernateUtil { private static SessionFactory sessionFactory; static { try { sessionFactory = new AnnotationConfiguration() .addPackage("com.vizyon.arge.tirtil.entity") .addAnnotatedClass(com.vizyon.arge.tirtil.entity.Uye.class) .configure().buildSessionFactory(); } catch(Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } |
Buraya kadar herşeyi tamamladık. Şimdi projemizi bir test edelim. Hibernate’e Giriş yazısından hatırlayacağınız gibi hibernate.cfg.xml dosyasındaki bir özellik ile projemiz başlatılır iken otomatik olarak sınıflardaki değişiklikleri veritabanına yansıtabilmesini sağlayabililiyorduk.
<property name=”hbm2ddl.auto”>update</property>
hbm2ddl.auto = update olduğu için projemizi ilk başlattığımızda bizim için uye tablosu otomatik olarak veritabanında oluşturulması lazım. Onun için şimdi Main.java sınıfına şu kod parçacığını yararak projemizi çalıştıralım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { Session session = null; try { session = HibernateUtil.getSessionFactory().openSession(); System.out.println("Welcome Tirtil!"); } catch(Exception e) { System.out.println(e.getMessage()); } finally { session.close(); } } } |
Projeyi çalıştırdığımda Console’da Welcome Tirtil! yazısını aldım. Bu sonuç bize bütün işlemleri tamamladığımızı gösteriyor. Veritabanında uye tablosu başarılı bir şekilde oluşturulmuş:
Bir sonraki yazıda annotation ile yapılandırmalara devam edeceğim. Sınıflar arası ilişkileri annotation ile nasıl tanımlayacağımızı göstereceğim. Daha sonrasında ise Session yönetimi, insert, delete gibi işlemlerin hibernate ile nasıl yapıldığını göstereceğim.
Şimdilik bukadar
Programlama ve hayata dair yazılar yazdığım bloguma hoş geldiniz.
Adım Kamil. 23 yaşındayım. Yazılım geliştiricisiyim. Selçuk Üni. Bilgisayar Programcılığı
bölümünden mezunum. Açık Öğretim İktisat Fakultesi 3. sınıf öğrencisiyim. Profesyonel hayatımda java ve php tabanlı
yazılımlar geliştirmekteyim. Antalya'da bir turizm firmasında yazılım geliştirme
uzmanı olarak çalışmaktayım.




