27 Nisan 2014 Pazar

Hibernate Annotations

Merhaba arkadaşlar,

Bu yazımda sizlere Hibernate Annotation'lardan bahsedeceğim. Bildiğiniz üzere bundan önceki konularımızda veritabanımızda bulunan tabloları eşleme yapmak için  XML dosyaları kullandık. Bu eşleme işleminin bir diğer yöntemi de Hibernate Annotation'ları kullanarak eşleme yapmaktır. Peki bu Hibernate Annotation'lar nedir ve nasıl kullanılır? onlardan bahsedelim.

Öncelikle bu annotation'ları kullanabilmek için ilgili jar dosyalarını indirmemiz gerekiyor. Bunlar hibernate-annotations.jar, hibernate-commons-annotations.jar ve ejb3-persistence.jar dosyalarıdır. Daha önceki haftalarda Hibernate projeleri için gerekli olan jar dosyalarını indirdik ve Hibernate adında bir User Library oluşturmuştuk. Oluşturduğumuz bu User Library içinde yukarıda bahsettiğim jar dosyaları da bulunuyordu. Eğer User Library oluşturmadıysanız ilgili jar dosyalarını projenize sağ tıklayıp Build Path ->Configure Build Path -> Libraries ->Add External JARs adımlarını izleyerek ekleyebilirsiniz.

Jar dosyalarımızı ekledikten sonra veritabanımızda "Isci" adında bir tablo oluşturalım.

create table Isci(
id INT NOT NULL auto_increment, 
ad VARCHAR(20) default NULL,
soyad VARCHAR(20) default NULL,
maas INT default NULL,
PRIMARY KEY (id) );

Şimdi bu tablomuzu Hibernate Annotaiton'ları kullanarak eşleyelim.


Öncelikle veritabanımızdaki tablomuzun isminde yeni bir java sınıfı oluşturuyoruz. EJB 3 standart anotasyonlarını içeren javax.persistence paketini import ediyoruz ve sınıf ismimizin üstüne @Entity ve @Table anotasyonlarımızı yazıyoruz.

@Entity anotasyonu kullanarak Isci sınıfımızın bir Entity Bean olduğunu belirtiriz. Peki Entity Bean nedir? kısaca değinecek olursak. Entity Bean bir veritabanındaki iş varlık nesnesini temsil eder. Yani biraz daha açacak olursak veritabanımızda bulunan her bir tablo bir Entity Bean'e karşılık gelir. Bu tablolarımızdaki her bir satır da Entity Bean Instance'a karşılık gelir. Entity Bean veriyi objeleştirir ve üzerinde daha kolay işlem yapmamızı sağlar. Entity Bean'ler kalıcıdır, primary key'leri vardır, paylaşımlı erişime izin verir ve diğer entity bean'ler ile ilişki oluşturulabilir. Ayrıca Entity Bean'lerin parametresiz constructor'u olmak zorundadır.

@Table anotasyomunuz ise veritabanımızdaki tablomuzun ismine karşılık gelir. Name atribute'nun yanı sıra catalogue, schema ve unique constraint attribute'lerini de içerir. Biz name attribute'unu kullanarak tablo ismimizi belirteceğiz.

Kullandığımız diğer anotasyonlardan @Id ve @GeneratedValue anatosyonları ise yukarıda Entity Bean'lerden bahsederken onların primary key'lerinin olduğuna değinmiştik. Entity Bean olan Isci sınıfımızın primary key'ini belirtiyoruz.

@Column anotasyonu ise tablomuzda yer alan sutun değerlerine karşılık gelir. Bu anotasyonun name attribute'unun yanı sıra length, nullable, unique attribute'lerini de alır.

Daha sonra tablomuzdaki attribute değerlerine karşılık gelen değişkenlerimizin getter&setter methodlarını oluşturuyoruz. Böylece Hibernate anotasyonlarını kullanarak tablomuzu eşlemiş olduk. Oluşturduğumuz bu sınıfı daha öncede bahsettiğimiz hibernate configuration dosyamıza (hibernate.cfg.xml) mapping class olarak belirtiyoruz.
<mapping class="com.hibernate.example.Isci" />

Buraya kadar veritabanımızda bulunan tablomuzu Hibernate anotasyonları kullanarak nasıl eşleyeceğimizi görmüş olduk. Haftaya anotasyonlar kullanarak daha detaylı bir örnek proje oluşturmayı planlıyorum. Takipte kalmaya devam edin...

20 Nisan 2014 Pazar

Many-to-many Association XML Mapping

   Merhaba arkadaşlar,

   Bugün sizlere aralarında many-to-many ilişkisi bulunan öğrencilerin ve onların almış olduğu derslerin bilgisinin tutulduğu iki tablo kullanarak örnek bir proje oluşturacağım.

   Öncelikle veritabanı aracımızda 'Ogrenciler' ve 'Dersler' adında iki tablo oluşturacağız. Ben veritabanı aracı olarak MySQL kullandığımı daha önceden belirtmiştim. Kendi MySQL WorkBench'imde 'Ogrenciler' ve 'Dersler' adında iki tablo oluşturdum.

CREATE TABLE `uyeler`.`ogrenciler` (
`OgrenciId` INT NOT NULL AUTO_INCREMENT,
`OgrenciAdSoyad` VARCHAR(45) NULL,
PRIMARY KEY (`OgrenciId`));

CREATE TABLE `uyeler`.`dersler` (
`DersId` INT NOT NULL AUTO_INCREMENT,
`DersAdi` VARCHAR(45) NULL,
PRIMARY KEY (`DersId`));

Yukarıdaki tabloları oluşturduktan sonra tablolar arasındaki ilişkinin many-to-many olmasından dolayı üçüncü bir ilişki tablosu oluşturmamız gerekiyor. 'Kayit' adında yeni bir ilişki tablosu oluşturacağız.

CREATE TABLE `uyeler`.`kayit` (
`DersId` INT NOT NULL,
`OgrenciId` INT NOT NULL,
PRIMARY KEY (`DersId`, `OgrenciId`),
CONSTRAINT `DersId`
FOREIGN KEY (DersId)
REFERENCES `uyeler`.`dersler` (DersId)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `OgrenciId`
FOREIGN KEY (OgrenciId)
REFERENCES `uyeler`.`ogrenciler` (OgrenciId)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Daha önceden oluşturduğumuz 'Ogrenciler' ve 'Dersler' adındaki tabloların primary keylerini bu tabloda foreign key olarak belirledik.
Tablo yapılarımızı oluşturduktan sonra içlerine kayıt ekleyelim.

                       'Dersler' tablosu                                            'Ogrenciler' tablosu 
   
       

Şimdi bu iki tablo arasındaki many-to-many ilişkiyi gösteren 'Kayit' tablosuna kayıt ekleyelim.

                                                        'Kayit' tablosu
                                        

Veritabanına kayıt ekleme işlemlerini tamamladıktan sonra Hibernate kısmına geçelim. Öncelikle boş bir proje açıyoruz. Açtığımız projeye daha önceki yazılarımda değindiğim Hibernate kütüphanelerini içeren User Libraryimizi dahil ediyoruz. Daha sonra veritabanımızda oluşturduğumuz tablolarımızın POJO sınıflarını oluşturuyoruz. 'Dersler' tablosunu eşlemek için aynı isimli bir java sınıfı oluşturuyoruz.

Dersler.java


Öğrenci bilgisini içeren 'Ogrenciler' adındaki tabloyu eşlemek için Ogrenciler adında yeni bir java sınıfı oluşturuyoruz.
Ogrenciler.java


Daha sonra veritabanında oluşturduğumuz tabloları eşlemek için  XML mapping dosyalarını oluşturuyoruz.

Dersler.hbm.xml

'Dersler' tablosunun XML eşlemesini tamamladıktan sonra 'Ogrenciler' tablosunun XML eşlemesini yapıyoruz. Bu işlem için Ogrenciler.hbm.xml adında yeni bir XML dosyası oluşturuyoruz.

Ogrenciler.hbm.xml

XML mapping işlemini tamamladıktan sonra Hibernate configuration dosyamızı oluşturuyoruz.

hibernate.cfg.xml


Oluşturduğumuz bu xml dosyasına veritabanı bağlantı bilgilerimizi ve daha önceden oluşturduğumuz xml mapping dosyalarımızın kaynağını belirtiyoruz.

Daha sonra SessionFactory oluşturarak Hibernate işlemlerimizi sağlayan HibernateUtil adında yeni bir sınıf oluşturuyoruz.

HibernateUtil.java


Yukarıda belirttiğimiz tüm bu işlemlerden sonra ana sınıfımız olan Main sınıfında yeni ders kayıtları ve öğrenci kayıtları oluşturup, bu kayıtlar arasındaki ilişkiyi belirten kodu yazıyoruz. 

Main.java


Kültürel Etkinlik ve Almanca adında yeni 2 ders kaydı oluşturduk. Aynı zamanda Zeki Bahar ve Kamil Gunes adında iki yeni öğrenci oluşturduk ve bu öğrencilerin Kültürel etkinlik ve Almanca derslerini almalarını sağladık. Buradan da anlaşılacağı üzere bir dersi birden fazla öğrenci alabilir ve bir öğrenci birden fazla ders alabilir (many-to-many ilişkisi).
Bu işlemler sonucunda veritabanımızdaki tablolarımızın son hali şu şekilde olacaktır.

                        Dersler tablosu                                             Ogrenciler tablosu

  
                                         
                                                                       Kayit tablosu

Burada yazıma son veriyorum. Bir sonraki yazımda görüşmek üzere. Esen kalın...

11 Nisan 2014 Cuma

One-to-one(1-1) XML Mapping 2.Bölüm

   Merhaba arkadaşlar,

   Bu hafta bir önceki yazımda bahsettiğim Mapping kavramı ve one-to-one(1-1) XML Mapping yapısı için oluşturduğumuz uygulamamıza devam edeceğiz. Önceki yazımızda POJO sınıflarımızı ve XML mapping dosyalarımızı oluşturmuştuk. Bu hafta ise yeni bir işçi ve 1-1 ilişkide ona karşılık gelen adresin eklenmesi ve işçi bilgilerinin güncellenmesi gibi konuların üzerinde duracağız. Tüm bu işlemleri yapmak için öncelikle "Uygulama" adında yeni bir class oluşturuyoruz.

public class Uygulama {
          private static SessionFactory factory;

      public static void main(String[] args) {
    // hibernate.cfg.xml dosyasındaki ayarlara ait bir session factory  yaratıyoruz.
           factory = new Configuration().configure().buildSessionFactory();

   //üzerinde işlem yapabilmek için bulunduğumuz sınıftan bir nesne oluşturuyoruz.
          Uygulama obj = new Uygulama();

  //yeni bir işçi ve ona ait olan adres eklemek için aşağıda oluşturdurduğumuz adresEkle() ve    isciEkle() methodlarına parametre gönderiyoruz.
          Adres adres1= obj.adresEkle("Yenibaglar","Eskisehir","26000");
          Integer isciId1 = obj.isciEkle("Ali", "Ak", 2500, adres1);

          Adres adres2= obj.adresEkle("Şirintepe","Eskisehir","26000");
          Integer isciId2 = obj.isciEkle("Veli", "Al", 1500, adres2);

          obj.isciMaasGuncelle(isciId1,3000);   //yukarıda oluşturduğumuz "Ali Ak" isimli işçinin maaşını 3000 olarak güncellemek için  isciMaasGuncelle() methoduna işçinin id'si ile yeni maaş değerini gönderiyoruz.

//veritabanımızda bulunan Adres tablomuza yeni bir kayıt ekleme için adresEkle() methodu oluşturduk.
public Adres adresEkle(String mahalle, String sehir, String postakodu) {
        //daha önceden oluşturduğumuz session factory üzerinde yeni bir session açıyoruz.
        Session session = factory.openSession();
Transaction trans = null;
Integer adresId = null;
Adres adres = null;
try{
trans = session.beginTransaction(); //açtığımız sessionda transaction işlemini başlatıyoruz.
        //yeni bir adres ekleyeceğimiz için Adres nesnesi oluşturuyoruz 
                adres = new Adres(mahalle, sehir, postakodu);
       //oluşturduğumuz adres nesnesini sessiona kaydediyoruz.
adresId = (Integer)session.save(adres);
       //veritabanında yeni bir adres kaydı eklenmesi için transaction işlemimizi veritabanına   gönderiyoruz.
trans.commit();
}catch (HibernateException e) {
       //eğer transaction sırasında bir hata oluşursa yapılan değişikliği geri almak için rollback yapıyoruz.
if (trans!=null) trans.rollback();
e.printStackTrace();
}finally {
session.close();  //işlemimizi bitirdikten sonra daha önceden açtığımız sessionı kapatıyoruz.
}
return adres;
}

Yeni bir adres bilgisi eklemek için yaptığımız işlemlerin aynısını yeni bir işçi eklemek içinde yapıyoruz. Yeni bir işçi eklemek için isciEkle() methodunu oluşturuyoruz.

public Integer isciEkle(String ad, String soyad, int maas, Adres adres){
Session session = factory.openSession(); 
Transaction trans= null; 
Integer isciId = null;
try{ 
trans= session.beginTransaction(); 
Isci isci = new Isci(ad, soyad, maas, adres); 
isciId = (Integer) session.save(isci);
trans.commit(); 
}catch (HibernateException e) { 
if (trans!=null) trans.rollback(); 
               e.printStackTrace(); 
}finally { 
                 session.close(); 
return isciId;
 }

Şimdiye kadar yeni bir işçi ve ona ait adres bilgisini oluşturduk ve veritabanımıza ekledik. Peki şimdi de veritabanımıza kaydettiğimiz işçilerin maaşlarını güncelleyelim.

public void isciMaasGuncelle(Integer IsciId, int maas){ 
Session session = factory.openSession(); 
Transaction trans= null;
try{ 
trans = session.beginTransaction();
Isci isci = (Isci)session.get(Isci.class, IsciId);
isci.setMaas(maas);   //yeni maaş değerini atayalım.
session.update(isci);   //işçi nesnemizi güncelleyelim.
trans.commit();       //yaptığımız değişikliği veritabanına gönderelim.
}catch (HibernateException e) {
if (trans!=null) trans.rollback(); 
               e.printStackTrace(); 
}finally {
               session.close(); 
}
}
}
}

Bugünkü uygulamamızda daha önceden eşleme(mapping) işlemini yaptığımız tablolara yeni kayıt ekleme ve kayıt güncelleme işlemlerini gerçekleştirdik. Bir sonraki yazımda görüşmek üzere...