30 Mart 2014 Pazar

Mapping Kavramı ve one-to-one(1-1) Association XML Mapping Yapısı 1.Bölüm

   Merhaba arkadaşlar,

   Bu yazımda sizlere Mapping kavramı ve one-to-one(1-1) Association Xml Mapping yapısından bahsedeceğim.

   Öncelikle Mapping kavramına değinecek olursak. Veritabanımızda bulunan tabloların Java sınıflarıyla eşleştirilmesine Mapping denir. Hibernate ile yaptığımız veritabanı işlemlerininin veritabanımıza yansıması için veritabanımızda bulunan her bir tabloyu onlara karşılık gelen Java sınıflarıyla eşleştirmeliyiz. Şimdi isterseniz bu eşleştirme işlemini nasıl yapıyoruz ona bir göz atalım.

   Veritabanımızda "Isci" adında bir tablo oluşturuyoruz. Bu tabloya id, ad, soyad, maas, adres sütunlarını ekliyoruz. İkinci bir tablo olarak adres detaylarını içeren "Adres" adında bir tablo oluşturuyoruz. Bu tabloya da id, mahalle, sehir ve postakodu alanlarını ekliyoruz. Bu iki tablo arasındaki ilişkinin de one-to-one olduğunu belirtiyoruz.

   Tablolarımızı oluşturduktan sonra geçen hafta bahsettiğimiz POJO sınıflarını oluşturuyoruz. "Isci" tablosuna karşılık gelen POJO sınıfını aşağıdaki gibi oluşturuyoruz. 

Isci.java
public class Isci {
         private int id;
         private String ad;
         private String soyad;
         private int maas;
         private Adres adres;

public Isci() {}                 //default constructor
public Isci(String ad, String soyad, int maas, Adres adres ) {       //parametreli constructor        
                 this.ad = ad;
                 this.soyad = soyad;
                 this.maas = maas;
                 this.adres = adres;
}

     //getter&setter methodları
  public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
public String getSoyad() {
return soyad;
}
public void setSoyad(String soyad) {
this.soyad = soyad;
}
public int getMaas() {
return maaş;
}
public void setMaas(int maas) {
this.maaş = maaş;
}
public Adres getAdres() {
return adres;
}
public void setAdres(Adres adres) {
this.adres = adres;
}
}

Adres tablomuza karşılık gelen Java sınıfını oluşturalım.

Adres.java
Yukarıda yaptığımız aynı işlemle Adres tablosuna karşılık gelen Adres.java sınıfını oluşturuyoruz.

POJO sınıflarımızı oluşturduktan sonra her bir sınıfa ait XML Mapping dosyası oluşturuyoruz. Yeni bir XML dosyası oluşturup Isci.hbm.xml ismini veriyoruz. Bu dosyaya tablomuz ve tablomuzda bulunan sütunlara karşılık gelecek olan bilgileri yazıyoruz.

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

<hibernate-mapping>
   <class name="Isci" table="Isci"> 
       <meta attribute="class-description"> Bu sinif isci bilgilerini icerir. </meta> 
       <id name="id" type="int" column="id"> <generator class="native"/> </id>
       <property name="ad" column="ad" type="string"/> 
       <property name="soyad" column="soyad" type="string"/>
       <property name="maas" column="maas" type="int"/>
       <one-to-one name="adres" column="adres" unique="true" class="Adres" not-null="true"/>    
  </class>
</hibernate-mapping>

Yukarıda belirttiğimiz one-to-one tagı Isci tablosu ile Adres tablosu arasındaki ilişkiyi yansıtır.

Şimdi diğer tablomuz olan Adres tablomuzun XML Mapping dosyasını oluşturalım. Yine aynı yöntemle yeni bir XML dosyası oluşturup Adres.hbm.xml adını veriyoruz.

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

<hibernate-mapping>
   <class name="Adres" table="Adres"> 
       <meta attribute="class-description"> Bu sinif adres bilgilerini icerir. </meta> 
       <id name="id" type="int" column="id"> <generator class="native"/> </id>
       <property name="mahalle" column="mahalle" type="string"/> 
       <property name="sehir" column="sehir" type="string"/>
       <property name="postakodu" column="postakodu" type="string"/>    
  </class>
</hibernate-mapping>

Şimdiye kadar veritabanımızda bulunan tablolarımıza karşılık gelen POJO sınıflarımızı ve XML Mapping dosyalarımızı oluşturduk. Oluşturduğumuz Isci.hbm.xml ve Adres.hbm.xml dosyalarını mapping resource olarak hibernate.cfg.xml dosyamıza eklemeyi unutmuyoruz.
       <mapping resource="Isci.hbm.xml"></mapping>
       <mapping resource="Adres.hbm.xml"></mapping>
 Haftaya bu oluşturduğumuz yapılar üzerinden devam edeceğiz. Takipte olmayı ihmal etmeyin...

Referanslar:









23 Mart 2014 Pazar

Hibernate Kurulumu ve Örnek Proje Oluşturma

   Merhaba arkadaşlar,

   Bu yazımda size geçen hafta giriş yaptığım Hibernate teknolojisinin Eclipse ortamına kurulumunu ve ilk örnek projemizi nasıl oluşturacağımızdan bahsedeceğim.

   Hibernate kurulumuna geçmeden önce projede kullanacağımız diğer araçlardan bahsedeyim. Geçen hafta da belirttiğim gibi projelerimde veritabanı aracı olarak MySQL kullanacağım. Fakat siz bir önceki yazımda da belirttiğim Hibernate'in desteklediği diğer veritabanı araçlarını da kullanabilirsiniz.

   Veritabanı aracı olarak MySQL kullanmak isteyen arkadaşların öncelikle MYSQL sunucusunu bilgisayarlarına kurmaları gerekmektedir. İlgili link aracılığıyla MySQL Community Server'ı ücretsiz olarak indirebilir ve bilgisayarınıza kurabilirsiniz. MySQL Server kurulumunu gerçekleştirdikten sonra veritabanı işlemlerimizi daha kolay yapmamızı sağlayan MySQL Workbench aracını da aynı link aracılığıyla indirebilir ve bilgisayarınıza kurabilirsiniz. 

   Yukarıda bahsettiğim kurulumları gerçekleştirdikten sonra MySQL ile Java ortamının bağlantısını gerçekleştirebilmek için MySQL Connector/J kütüphanesini indirmemiz gerekmektedir. Bu kütüphaneyi İlgili link aracılığıyla indirebilirsiniz. Aynı link aracılığıyla MySQL'in diğer ortamlarla bağlantısını sağlayan kütüphaneleri de indirebilirsiniz.

   Veritabanı işlemleri için gerekli olan kurulumların yapılmasından sonra Hibernate teknolojisinin Eclipse ortamına kurulumuna geçelim.Öncelikle ilgili link aracılığıyla Hibernate'in son sürümünü ve önceki sürümlerini indirebilirsiniz. Daha sonra yine projelerimizde kullanacağımız Hibernate Annotations kütüphanelerini indirmemiz gerekiyor. Yine ilgili link aracılığıyla bu kütüphaneleri indirebilirsiniz.

   Kullanacağımız kütüphaneleri indirdikten sonra bu kütüphaneleri projemize dahil edelim. Eclipse üzerinden File -> New -> Java Project yolunu izleyerek yeni proje oluşturduktan sonra Eclipse'in Window sekmesi üzerine gelip Preferences seçeneğinine tıklıyoruz.Tıkladıktan sonra karşımıza aşağıdaki gibi bir pencere geliyor ve bu pencereden Java -> Build Path -> User Libraries seçeneğine tıklıyoruz.

   
   Daha sonra New butonuna basıyoruz ve oluşturmak istediğimiz User Libraries ismini yazıyoruz. Ben isim olarak Hibernate yazdım. Kendi User Library'imizi oluşturduktan sonra içine daha önceden indirdiğimiz jar dosyalarımızı yani kütüphanelerimizi ekliyoruz. Bu işlemi yukarıdaki resimde de görüldüğü gibi Add External JAR's butonu ile yapıyoruz. İlgili jar dosyalarımızın tamamı aşağıda bulunan resimdeki gibi olmalıdır.


   Tüm bu işlemlerin sonunda kendi User Library'imizi oluşturduk ve sıra projemize dahil etmeye geldi. Bu işlem için proje ismimize sağ tıklıyoruz ve Build Path -> Add Libraries... -> User Library yolunu izleyerek kendi oluşturduğumuz User Library ismini seçiyoruz. 

   Bir sonraki adım olarak Hibernate configuration dosyamızı oluşturacağız. Bu işlem için proje ismimize sağ tıklayıp New -> Other... -> XML File seçeneğine tıklıyoruz ve dosya ismi olarak hibernate.cfg.xml adını veriyoruz. Oluşturduğumuz bu XML dosyasına Hibernate'in hangi dili konuşacağı, veritabanının nerede olacağı, hangi kullanıcı adı ve şifre ile bağlanacağını yazıyoruz. Ayrıca opsiyonel olarak oluşturduğu sql sorgularını göstermesini de isteyebiliriz. Tüm bu işlemler için aşağıdaki kodu XML dosyamıza yazıyoruz.

<?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.connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="hibernate.connection.password"></property>
       <property name="hibernate.connection.url">jdbc:mysql://localhost/uyeler</property>
       <property name="hibernate.connection.username">root</property>
       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
       <property name="current_session_context_class">thread</property>
       <property name="hibernate.show_sql">true</property>
   </session-factory>
</hibernate-configuration>
   
   Hibernate gibi ORM araçları bir nesnenin veritabanında hangi tabloya karşılık geldiğini işaretler. Bu işaretleme işlemine "mapping" denir. Mapping'in nasıl olacağını biz belirleriz. İlerleyen yazılarda daha detaylı olarak inceleyeceğiz. Hibernate veritabanına kayıt işlemi için POJO'lardan yararlanır. POJO (Plain Old Java Object), getter/setter methodları ve attribute'lerden oluşan basit bir Java nesnesidir. Hibernate'in oluşturduğumuz bu POJO nesnelerini veritabanında hangi tabloya saklayacağını, nasıl saklayacağını mapping dosyasında belirtiriz. Bu mapping dosyası POJO nesnemizin bulunduğu sınıfla aynı dizinde bulunmalıdır.

   Tüm bu anlatılanlardan sonra POJO nesnemizin bulunduğu sınıfı oluşturalım. Sınıf ismi olarak "Kisiler" adını verelim. Bu sınıfımızda kişilerin id, ad ve soyad bilgilerini tutacağız. Hibernate'in bu bilgilere ulaşabilmesi için ilgili bilgilerin getter ve setter methodlarını oluşturacağız. Bu işlem için oluşturduğumuz attributeleri seçerek Eclipse'in Source penceresinden Generate Getters And Setters seçeneğine tıklıyoruz ve getter ve setter methodlarımız oluşuyor.

public class Kisiler {

  int id;

  String ad;

  String soyad;

  

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
public String getSoyad() {
return soyad;
}
public void setSoyad(String soyad) {
this.soyad = soyad;
}
}

   Şimdi oluşturduğumuz bu sınıfın mapping dosyasını oluşturalım. Bunun için oluşturduğumuz Kisiler adındaki sınıfın bulunduğu dizine Kisiler.hbm.xml adında XML dosyası oluşturuyoruz.

<hibernate-mapping>

   <class name="Kisiler" table="kisiler">

    <id column="id" name="id"><generator class="increment"></generator> </id>

    <property column="ad" length="20" name="ad" type="string"></property>

    <property column="soyad" length="20" name="soyad" type="string"></property>

  </class>
</hibernate-mapping>

   Yukarıdaki kodu oluşturduğumuz XML dosyasına yazıyoruz.Şimdi oluşturduğumuz mapping dosyasını Hibernate'e tanıtalım. Bu işlem için önceden oluşturduğumuz hibernate.cfg.xml dosyasına şu satırı ekleyelim.
<mapping resource="Kisiler.hbm.xml"> </mapping>

   Gerekli ayarları yaptık bundan sonra nesnemizi istediğimiz gibi kontrol edebiliriz. Sonraki aşama olarak Test adında yeni bi sınıf oluşturuyoruz ve aşağıdaki kodları ekliyoruz.

public class Test {

   public static void main(String[] args) {



 // Bir tane session tanımlıyoruz.

 Session session = null;



 // hibernate.cfg.xml dosyasındaki ayarlara ait bir session factory  yaratıyoruz
 SessionFactory sessionFactory = new                               Configuration().configure().buildSessionFactory();

 // Bu session Factory'den bir session açıyoruz.
 session = sessionFactory.openSession();

 // Bir transaction açıyoruz
 Transaction transaction = session.getTransaction();

 try {

  // Yapılacak işlemleri yapıyoruz
  Kisiler kisi = new Kisiler();
   kisi.setAd("Ali");
  kisi.setSoyad("Veli");

  transaction.begin(); // Transaction'umuzu başlatıyor
  session.save(kisi); // kisi objemizi save ediyor
  transaction.commit(); // ve bu transaction'u veritabanına gönderiyoruz.

 } catch (Exception e) {
     e.printStackTrace();
  }
 
 finally {
  session.close(); //veritabanı işlemimiz başarılı olsa da olmasa da session'u    kapatıyoruz.
 }
    }
}

   Böylece hiçbir sql komutu yazmadan veritabanımıza "Ali Veli" adında yeni bir kişi eklemiş olduk.Bu haftaki yazım biraz uzun oldu ama umarım faydalı olmuştur. Gelecek hafta yeni bir konu ile karşınızda olacağım. Takipte kalmanız dileğiyle...

Referanslar:






   

16 Mart 2014 Pazar

Hibernate Teknolojisine Giriş

   Merhaba arkadaşlar,

   On hafta boyunca sizlere Hibernate teknolojisinden bahsedeceğim. Bu on haftalık süre boyunca Hibernate kullanımını, Hibernate ile hangi işlemlerin yapılabileceğini, Hibernate teknolojisinin avantajlarını sizlere sunacağım.
 
   Bu haftaki yazımda sizlere ORM (Object/Relational Mapping) yapısından, Hibernate mimarisinden ve Hibernate teknolojisinin sağladığı kolaylıklardan bahsedeceğim.

   Hibernate, java platformunda yazılmış bir ORM (Object/Relational Mapping) aracıdır.Hibernate teknolojisini daha iyi anlayabilmek için öncelikle ORM'nin ne olduğuna bakalım.

   ORM, ilişkisel veri tabanı ile nesnelerimiz aracılığıyla bağlantı kurmamızı sağlayan araçtır. Birçok Java ORM çatısı mevcuttur. Bunlardan bazıları TopLink, Castor, Spring DAO, Java Data Object ve konumuz olan Hibernate 'dir.

   Hibernate 2001 yılında Gavin King tarafından geliştirilmiştir. Oldukça güçlü ve yüksek performanslı bir ORM aracıdır. Son yıllarda kullanımı giderek artan bir teknolojidir. Peki Hibernate ne iş yapar? ve ne gibi avantajlar sağlar? Hibernate, ilişkisel veritabanından veri sorgulama (data query) ve veri çekme (data retrival) işlemlerinin daha kolay yapılmasını sağlar. Böylelikle geliştirme kolaylığı ve zamandan kazanç sağlar. Ayrıca geliştiricinin ortak veri kalıcılığı (data persistence) yükünü hafifletir ve SQL kodlarını ayıklanmasını sağlayarak sonuç kümesi'nin (result set) işlenmesinde kolaylıklar sağlar. Hibernate nesne ilişkilerini desteklediği gibi bileşik tipleri de destekler. Bunların yanı sıra güçlü bir sorgulama dili (query language) desteğiyle kayıtları etkili bir şekilde veritabanından çekme ve önbelleğe alma (caching) işlemini gerçekleştirir.

   Hibernate hemen hemen yaygın tüm veritabanı sistemleri ile uyumludur. MySQL, PostgreSQL, FrontBase, Oracle, MSSQL Server ve daha bir çok veri tabanı kullanılabilir. Biz bu on haftalık süreçte MySQL veritabanı ile işlemler yapacağız.

   Şimdilik Hibernate teknolojisinden kısaca bahsettik ilerleyen yazılarımda daha detaylı bilgiler vereceğim.Gelecek haftalarda üzerinde duracağımız konular şu şekilde olacaktır;

1- Hibernate kurulumu ve örnek proje oluşturma
2- Mapping ve One to one Association Xml Mapping yapısı 1.Bölüm
3- One-to-one Xml Mapping 2.Bölüm
4- Many to many Association Xml Mapping yapısı
5- Hibernate Annotations
6- Annotation kullanarak Many to one ilişkisi
7- Hibernate Inheritance One Table Per Subclass (Hibernate Anotasyon ile)
8- Hibernate Inheritance One Table Per Hierarchy (Hibernate Anotasyon ile)
9- Hibernate projelerinde rastlanan hata mesajları ve çözümleri

Haftaya bir sonraki yazımda görüşmek üzere...

Referanslar :

1- http://viralpatel.net/blogs/introduction-to-hibernate-framework-architecture
2- http://belgeler.cs.hacettepe.edu.tr/
3- http://www.tutorialspoint.com/hibernate
4- http://tr.wikipedia.org/wiki/Hibernate