Hibernate’e Giriş

01 oben logo Hibernatee Giriş programlama
İlişkisel veritabanı modellemesi günümüz teknolojisinin bize sunduğu önemli araçların başında gelmektedir. Projelerde veritabanı yonetimini, veri bütünlüğünü vs. daha iyi sağlamamızı kolaylaştırır. Nesneye dayalı programlama yontemi dediğimizde, ilişkisel veritabanı modellemesi ön plana daha iyi çıkar. Hibernate bu alanda bize, java nesnelerimiz ile veritabanı tablolarımız arasında bir bağ kurararak programcının işlerini büyük ölcüde kolaylaştırır. 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.

hb yeni proje Hibernatee Giriş programlama

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

hb kutuphaneleri ekle2 Hibernatee Giriş programlama

Ş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.

hb adres nesnesi2 Hibernatee Giriş programlama

 

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ı.

hb hibernate cfg Hibernatee Giriş programlama

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ı :

hb hibernate util Hibernatee Giriş programlama

Ş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.

hb bos veritabani Hibernatee Giriş programlama

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

hb dolu veritabani Hibernatee Giriş programlama

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

hb adres table Hibernatee Giriş programlama

Kişi Tablosu :

hb kisi table Hibernatee Giriş programlama

Ş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 icon smile Hibernatee Giriş programlama

Kamil ÖRS

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

Arama Terimleri:

hibernate örnekleri, hibernate örnek, hibernate giriş, kamil örs, bir evin gelir gider tablosu boş, hibernate many to one örnek, hibernate giriş ceviz, fihrist programı, hibernate many to one, netbeansde method yazmak

Benzer Konular:

  • Struts’a Giriş III Bu classlar Struts paketindeki org.apache.struts.action.ActionForm classını extend eden java-bean classlarıdır.Struts İle Form Bilgilerinin Validasyonunu sağlamak   Şimdiki dersimizde bir login...
  • Sinif propertylerinin kod arkasi C# siniflarinda private tanimli degiskenlerinize deger atamak, veya atanmis degeri okumak icin, properties olayini duymusunuzdur ve kullanmisinizdir. Ornek olarak mesela...
  • automatic property Dun C# 3.0  ile yeni gelen ozelliklerden extensions methodunu anlatmaya calismistim. Bugun ise gene C# 3.0 ile gelen baska bir...
Yazar - 08 Ekim 2008. Kategori PROGRAMLAMA. Bu yazıya yazılan yazıları RSS üzerinden takip edebilirsiniz RSS 2.0. Yorum yazabilir veya geri izlemede bulunabilirsiniz.

"Hibernate’e Giriş" için yapılan toplam yorum - 17

  1. Muharrem Taç

    Çok güzel ve gerekli bir makale olmuş.
    Tebrik eder, çalışmalarınızın devamını dilerim.

  2. Gökhan Atıl

    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.

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

    Makale icin teşekkürler

  4. 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

  5. :)

    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.

  6. Başlangıç olarak güzel bir makale olmuş, tebrikler ve teşekkürler.

  7. 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 !

  8. Allah sabır versin. ıyilik yap denize at. Yazı çok harika. Devamı gelir inşallah …

  9. fatih söyler

    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?)

  10. çok iyi anlatılmış teşekkürler

  11. 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?

  12. Güzel bir yazı olmuş, ellerine sağlık. Sabahtan beri ıngilizce – Türkçe birçok siteye baktım, en sonunda seni buldum.

    Teşekkürler
    Sinan – GYTE Bilgisayar Mühendisliği

  13. Mustafa KÜÇÜK

    Makale tadında olmuş teşekkürler
    ekran görüntüsünden yakınan arkadaşlar CTRL+ ile boyutu artırırlarsa sorun kalmaz

  14. bence güzel bir paylaşım.
    ekran görüntüsünden yakınan arkadaşlar siz daha iyisii yapında onu okuyalım. bunları yapan arkadaşların hevesini kırmak iyi bişey deil.
    BıLGı PAYLAşTIKÇA ÇOğALIR. PAYLAşMAK GÜZELDıR mantığıyla :)

  15. Ne zamandır hibernate öğreneyim diyordum.Sayenizde hibernate e çok güzel bir giriş yapmış oldum.Teşekkürler.Anlatım süper…

  16. ben hibernate i eclipse te kullanmak istiyorum. eclipse plug-in yükledim.ama şimdi nasıl devam edicem bilmiyorum yardım ederseniz sevinirim

  17. Merhabalar.Hıbernate ögrenmeye yeni başlayan biri olarak örnek çok güzel.Yaptıklarınızı bendeadım adım uyguladım ama şöyle bir hatayla karşılaştım.

    “Exception in thread “main” java.lang.NullPointerException
    at hibernatedeneme.Main.main(Main.java:31)

    yrdımcı olursanız sevinirim :)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>