Yazar GİRİŞİ

Son eklenen makale ve haberler

  Programlama

Hibernate'e Giriş

Bir örnek üzerinde hibernate'i nasıl kullanacağımızı görelim. Ben örnekleri netbeans kullanarak yapacağım.

Öncelikle hibernate.org dan core hibernate kütüphenesini indirip projenize dahil edebilir ya da daha kolay olması açısından netbeans plugin  yönetiminden "Hibernate 3.2.5 Liblary" ve "Hibernate Support" pluginlerini kurabilirsiniz.


İlk Olarak Netbeans'de yeni bir proje oluşturalım.




Oluşturduğumuz projemize hibernate core ve mysql jdbc driverını ekliyelim.



Şimdi Kütüphanelerimizi ekledikten sonra projemizde kullanacağımız sınfları oluşturarlim. Ben basit bir fihrist programı düşündüm.Kişinin;  Adını, Soyadını, Ev Telefonu, Cep Telefonu, Mail ve Adres bilgilerini tutan bir program yazalım. 

Hibernate'te kalıcı nesnelerimizi (database kaydedilecek olan nesneler) pojo dediğimiz en basit java sınıfı olarak oluşturuyoruz.  Sınıfdaki değişkenlerimizin getter ve setter fonksiyonları muklaka olmalıdır çünkü hibernate veritabanına yazarken ya da nesneyi veritabanından doldururken bu fonksiyonları kullanır. 

Kişi ve  Adres sınıflarımızı oluşturarak başlayalım.

Not :Netbeansde nesne değişkenlerinizi yazdıktan sonra , editöre sağ tıklayıp -> Insert Code -> Getter and Setter Seçeneğini seçerek kolaycana getter ve setter fonksiyonlarını oluşturabilirsiniz.




 

Adres.java :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.vizyon.demo.entity;

/**
 *
 * @author Kamil ÖRS
 */
public class Adres {
    private Integer id;
    private String adres1;
    private String adres2;
    private String zipCode;
    private Kisi kisi;
   
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
   
    public String getAdres1() {
        return adres1;
    }

    public void setAdres1(String adres1) {
        this.adres1 = adres1;
    }

    public String getAdres2() {
        return adres2;
    }

    public void setAdres2(String adres2) {
        this.adres2 = adres2;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    public Kisi getKisi() {
        return kisi;
    }

    public void setKisi(Kisi kisi) {
        this.kisi = kisi;
    }
}



Kisi.java :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.vizyon.demo.entity;

import java.util.HashSet;
import java.util.Set;

/**
 *
 * @author Kamil ÖRS
 */
public class Kisi {
    private Integer id;
    private String adi;
    private String soyadi;
    private String evTelefonu;
    private String cepTelefonu;
    private String mail;
    private Set<Adres> adresler = new HashSet<Adres>(0);

   
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
   
    public String getAdi() {
        return adi;
    }

    public void setAdi(String adi) {
        this.adi = adi;
    }

    public String getCepTelefonu() {
        return cepTelefonu;
    }

    public void setCepTelefonu(String cepTelefonu) {
        this.cepTelefonu = cepTelefonu;
    }

    public String getEvTelefonu() {
        return evTelefonu;
    }

    public void setEvTelefonu(String evTelefonu) {
        this.evTelefonu = evTelefonu;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getSoyadi() {
        return soyadi;
    }

    public void setSoyadi(String soyadi) {
        this.soyadi = soyadi;
    }

    public Set<Adres> getAdresler() {
        return adresler;
    }

    public void setAdresler(Set<Adres> adresler) {
        this.adresler = adresler;
    }
}



Sınıflarımızıda oluşturduktan sonra sıra geldi hibernate ayarlarımızı yapmaya. Hibernate ayarlarımızı "hibernate.cfg.xml" adlı bir dosyada tanımlıyoruz. Bu dosyada database bağlantı ayarları, database tableları ile ilişkilendirdiğimiz nesnelerimizin map dosyalarını vs. hepsini burada tanımlıyoruz. Ben Mysql kullanacağım için ayarlarımı mysql'e göre yapıyorum.

Not : Bu dosyamızın projemizin ana souce package altında yer alması gerekli.

hibernate.cfg.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/demo</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">12345</property>
   
   
  </session-factory>
</hibernate-configuration>



hibernate.dialect = Hibernate'in hangi veritabanına göre sql cümlesi üreteceğini söylüyoruz.
hibernate.connection.driver_class = jdbc driverın adresini belirtiyoruz
hibernate.connection.url = veri tabanı yolu
hibernate.connection.username = veritabanı kullanıcı adı
hibernate.connection.password = veritabanı kullanıcı şifresi


Bu ayarlarımızdan sonra proje ağacımızın yapısı şu şekilde olmalı.



Sıra sınıflarımızın map dosyarını hazırlamya geldi. Map dosyaları sınıflarımız ve veritabanı tablomuz arasında kalan dosyalarımızdır. hibernate bu dosyadaki ayarlara bakarak hareket eder.

Örnek dosya adı :  SınıfAdi.hbm.xml

Not : Bu map dosyaları, sınıfılarımızın bulunduğu source package altında olmalı (Şart değil)


Adres.hbm.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.vizyon.demo.entity.Adres" table="adres">
        <id name="id" column="id">
            <generator class="increment"/>
        </id>
       
        <property name="adres1" type="string" length="50" column="adres1" />
        <property name="adres2" type="string" length="50" column="adres2" />
        <property name="zipCode" type="string" length="5" column="zip_code" />
       
        <many-to-one name="kisi" column="kisi_id" not-null="true" class="com.vizyon.demo.entity.Kisi" />
       
    </class>
   
</hibernate-mapping>

 


Kisi.hbm.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.vizyon.demo.entity.Kisi" table="kisi">
        <id name="id" column="id">
            <generator class="increment"/>
        </id>
       
        <property name="adi" type="string" column="adi" length="25" />
        <property name="soyadi" type="string" column="soyadi" length="25" />
        <property name="evTelefonu" type="string" column="ev_telefonu" length="15" />
        <property name="cepTelefonu" type="string" column="cep_telefonu" length="15" />
        <property name="mail" type="string" column="mail" length="50" />
             
        <set name="adresler" cascade="all" lazy="true">
            <key column="kisi_id"/>
            <one-to-many class="com.vizyon.demo.entity.Adres" />
        </set>

    </class>
   
</hibernate-mapping>

 



Şimdi bu dosyalarımızda  kullandığımız parametreleri bir inceleyelim.

Class tagı içerisinde kullandığımız name sınıfımızın adresini temsil etmektedir. Tam paket adı ile birlikte sınıfıımızın adını yazıyoruz.  Bu sınıfımıza karşılık gelen tablo adını ise table kısmına giriyoruz. generator tagında ise alanımızın artan sayı şeklinde olduğunu belirtiyoruz.

Property tagı içinde ise sınıf değişkenlerimiz ile tablo alanlarını eşleştiriyoruz. Bu değişkenlerin tablo alanında nasıl olacağını belirtiyoruz.

Örneğin  <property name="adi" type="string" column="adi" length="25" />  tagının mysql deki karşılıği  adi VARCHAR(25) dir.


Map dosyarındaki id kısmı önemlidir. Çünkü hibernate tablolarımızda ve sınıflarımızda primary key alanının olmasını zorunlu tutar. id tagında primary key alanımızın nasıl olması gerektiğini tanımlıyoruz.
 

Kisi ve Adres tablolarını bir birlerini iliskilendirmek için hibernate'te one-to-one, one-to-many, many-to-one, many-to-many  tagları kullanılır. Bizim örneğimizde Kisi sınıfının  Adresleri olduğu için kişiye göre adres ile one-to-many yani bire çok ilişkisi kuruyoruz. Bir kişinin bir den fazla adresi olabilir mantığı ile bu yola çıkıyoruz.

Bunun için kisi.hbm.xml dosyasında adresleri temsilen set tagını, adres.hbm.xml de ise many-to-one tagını kullanıyoruz.

Map dosyalarımızı oluşturduktan sonra bu dosyalrın yerini hibernate.cfg.xml dosyamıza ekliyoruz.

    <mapping resource="com/vizyon/demo/entity/Adres.hbm.xml"/>
    <mapping resource="com/vizyon/demo/entity/Kisi.hbm.xml"/>


Hibernate.cfg.xml Dosyamızın değişiklikten sonraki görüntüsü :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/demo</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">12345</property>
    
    <mapping resource="com/vizyon/demo/entity/Adres.hbm.xml"/>
    <mapping resource="com/vizyon/demo/entity/Kisi.hbm.xml"/>
   
  </session-factory>
</hibernate-configuration>


Bütün bu ayarlarımızı yaptıktan sonra programızıda hibernate oturumu açmamızı kolaylaştırcak HibernateUtil isimli bir static sınıf oluşturuyoruz. Bu sınıf ben örneğimde com.vizyon.demo.util içine koyuyorum.

HibernateUtil.java :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.vizyon.demo.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 *
 * @author Kamil ÖRS
 */
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;
    }
 
}



HibernateUtil çağırdığımızda, hibernate.cfg.xml dosyasına bakarak gerekli oturumu açar ve bize bir hibernate Session sınıgı döndürür. Bu sınıf ile sorgulama yapabilir, nesnelerimizi database kayıt edebilir, silebilir ve güncelleyebiliriz.

Tüm bu ana kadarki projemizin ağaç görüntüsü şu şekilde olmalı :



Şu ana kadar yaptımız tüm kısım programımızla ilgiydi. Şimdi gerekli tablolarımızı database de oluşturalım. Bunun iki yolu var. Ya elle tablolarımızı oluştururuz ya da hibernate.cfg.xml de ufak bir eklenti ile tablolarımızın otomatik oluşmasını sağlarız. Sanırım 2. yöntem de size daha cazip gelmiştir. Bunun için hibernate.cfg.xml dosyamıza aşağıdaki tagı ekliyoruz.

<property name="hbm2ddl.auto">update</property>


Bu tag ekledimizde, hibernate ile ilk session açtılırken  veritabanına bakar tablolarımız varmı, eğer yoksa tablolarımızı oluşturur. Bir diğer yanı ise kalıcı sınıflarımıza yeni degiskenler ekledik. Bu degiskenleri de otomatik olarak ilk session açarken veritabanına gider oluşturur. Bu işlemde veritabanında yapmamız gereken tek işlem hibernate.cfg.xml de belirtimiz veritabanı adının mysql de olması.

Ben mysql de "demo" diye bir veritabanı oluşturdum ve şuan içinde herhangi bir tablo yok.




Programımızn Main sınıfında hibernate ile session açalım.

Main.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.vizyon.demo;

import com.vizyon.demo.util.HibernateUtil;
import org.hibernate.Session;

/**
 *
 * @author Kamil ÖRS
 */
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("OK !");
        }
        catch(Exception e) {
            System.out.println("Hata : " + e.getMessage());
        }
        finally {
            session.close();
        }
    }

}



Programımı F6 ile çalıştırdığımızda demo veritabanımızda herhangi bir tablo olmadığı için hibernate otomaik olarak tablolarımızı oluşturacak



Ve tablo yapılarımız tamda hbm.xml dosyalarımızda belirtiğimiz gibi :) Adres tablosunda da foregin key başarıyla oluşturuyor.


Kişi Tablosu :






Şimdilik bu kadar arkadaşlar. Daha iyi ayrıntı için hibernate referans dökümanına bakabilirsiniz. Bir sonraki yazımda  kaydetme, silme, güncelleme ve sorgulama işlemlerine bakarız. Sonra da tüm bu xml dosyaları ile uğraşmak yerine bu işleri annotationlar ile yapmanın nasıl olduğuna bakarız.

Annotationlar gerçekten bu işi çok kolaylaştırıyor ve zevkli hale getiriyor :)

Kamil ÖRS

Not: Yapmış olduğum Türkçe imla hataları ve anlatım bozuklukları için özür dilerim.


Zangetsu 08.10.2008

co.mments  del.icio.us  digg  Furl  NewsVine  Reddit  Spurl  TailRank  Wists   



Rating : 10 üzerinden 9.55
 



Tümünü Göster / Sadece Başlıklar Yorumlar

Cevizci Kaç inç
Abim senin monitör kaç inç ya o nasıl ekran görüntüsü öyle.

Makale icin teşekkürler
 
erhan okunabilirlik 0 sınıfta kaldın otur!
tamam da kardeşim benim monitör 24 inch diye bağıracağına sayfayı azcık küçültsen de bizde ağız tadıyla okusaydık şimdi makaleyi ne olurdu?

Al işte direk sayfa sonuna gelip yorum bırakıyorum makalen de senin olsun... peh...

görmemişin monitörü olmuş çekmiş çözünürlüğünü koparmış :p
 
:)

en üstkeki tam ekran netbeans görüntüsü haricinde diğerleri normal.

okuyup okumamak sizin bileceğiniz iş. Zamanım kısıtlı olduğu için birde ekran görüntüleri ile uğraşmadım.
 
Muharrem Taç Tebrikler
Çok güzel ve gerekli bir makale olmuş.
Tebrik eder, çalışmalarınızın devamını dilerim.
 
Ahmet Yas Güzel olmuş
Başlangıç olarak güzel bir makale olmuş, tebrikler ve teşekkürler.
 
vampire Tebrikler
Bir çok kişi yazılanların ne olduğunu anladığını sanmıyorum sadece bende anlıyorum diye çevresini kandırmaya çalışmaktadır ancak kendini kandırıyordur neyse makale hibernate konusunda bir çok insan için işe yaracak çok güzel bilgiler içermekte emeğiniz için teşekkürler !
 
Gökhan Atıl Çok güzel olmuş
Java ile az biraz uğraşan herkesin anlayabileceği kadar (ki ben şu an bu gruba giriyorum), basit ve anlaşılır bir yazı olmuş. Umarım devamı gelir.
 
Racih Teşekkür ederim
Allah sabır versin. İyilik yap denize at. Yazı çok harika. Devamı gelir inşallah ...
 
fatih söyler null pointer exception
makale gerçekten çok yararlı olmuş yalnız bende Main.java da session için null pointer exception verdi(gerçi başlangıçta initialize edilmiş ama?)
 
kyd teşekkürler
çok iyi anlatılmış teşekkürler
 
alparslan Main Fonksyonu içinde..
Merhaba, yazınız çok güzel, elinize sağlık.
Bu kadar işlem yaptıktan sonra main fonksyonu içinde bu session nasıl yönetmeliyiz, açık bıraksak bir sorun olurmu vb konularada girebilirmisiniz?


 




yorum Yorum ekle
İsminiz:
Mailiniz:
Yorum Konu:
Soru: Cumhuriyetimizin kuruluş yılı?
Cevap :
Bütün alanları doldurmanız gerekmektedir.

 
XHTML 1.0 CSS 2.1
Ceviz Reklam