Ornek Hibernate Uygulamasi

hibernate
  • Turgay Can
  • Tarih

    21 Apr, 2012
  • Yorum

    0
  • Görüntüleme

    2369
  • İndirme

    0

Ornek Hibernate Uygulamasi

Yarattığımız projeye Hibernate özelliklerini eklemek demek Hibernate’in kullanacağı tüm kütüphaneleri (jar dosyalarını) projemize entegre etmek demektir. Biz de örnek uygulamamızı yazmadan önce Hibernate’in kullandığı tüm kütüphaneleri indirerek uygulamamıza eklemeliyiz. Eğer benim gibi Hibernate’e direk destek veren bir geliştirme ortamı kullanıyorsanız bu kütüphaneleri uygulamaya entegre etmek çok daha basit hale gelecektir. Ben MyEclipse kullanarak Hibernate ile veri tabanı uygulaması yapacağım.

Önce yeni bir Java projesi yaratalım.

alt text

Sonra yarattığımız projeye Hibernate kütüphanelerini ekleyelim.

alt text

Karşımıza gelen sihirbazda Hibernate’in hangi versiyonunu kullanacağımızı seçtikten sonra annotation’ları kullanacağımızı belirtiyoruz.

alt text

Daha sonra veri tabanı bağlantı ayarlarının tutulacağı XML dosyasının adını ve adresini giriyoruz.

alt text

Bir sonraki adımda hangi veri tabanına bağlanacaksak o veri tabanının connection url, driver ve kullanıcı adı parola bilgilerini giriyoruz.

alt text

Yukarıda anlatmış olduğum session factory sınıfını otomatik olarak yaratmak isteyip istemediğimizi seçiyoruz. Eğer yaratacaksak sınıfın ismini ve bulunacağı paketi seçiyoruz.

alt text

En son Finish düğmesine bastığımızda dizin yapısı ve konfigurasyon dosyası aşağıdaki gibi olacaktır.

alt text

Bizim için HibernateSessionFacttory sınıfının yanında bir de hibernate.cfg.xml adında bir konfigurasyon dosyası yaratıldı. Bu dosya içerisinde veri tabanı bağlantı ayarları yer alıyor. Hangi veri tabanına bağlanacaksak onun connection url, driver class bilgilerini yazıyoruz.

Hibernate’e destek veren IDE’lerin bir diğer güzel özelliği de reverse engineering denilen otomatik sınıf yaratma işlemlerinin yapılabilmesidir.

Hibernate reverse engineering kullanarak entity ve dao sınıflarını artı hangi sınıfın hangi tabloya karşılık geldiğini belirten konfigurasyon dosyalarını yaratabiliriz ancak ben bu örnekte sadece entity sınıfını yaratacağım. DAO sınıflarını ve her entity sınıfının hangi tabloya karşılık geldiğini belirten XML dosyalarını yaratmayacağım. Bunun yerine annotation’ları kullanacağım.

Entity sınıflarını yaratmak için veri tabanı perspektifine geçerek sınıfını yaratacağım tablonun üzerinde sağ klik Hibernate Reverse Engineering… seçeneğine tıklıyoruz.

alt text

alt text

Açılan sayfada yaratılacak entity sınıfının paketini belirtiyoruz. Aşağı kısımda ise mapping’in hangi şekilde yapılacağını söylüyoruz. İlk seçeneği seçtiğimizde her bir entity sınıfı için bir de XML konfigurasyon dosyası yaratılır. İkinci seçenekte ise entity sınıfında annotation’lar ile mapping yapılır ki biz bu şekilde yapacağız. Dediğim gibi DAO ve POJO sınıflarını yaratmayacağız.

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "EMPLOYEE", schema = "CLASSICCARS")
public class Employee implements java.io.Serializable {

    // Fields

    private static final long serialVersionUID = 8874357696210233116L;
    private Integer employeenumber;
    private String lastname;
    private String firstname;
    private String extension;
    private String email;
    private String officecode;
    private Integer reportsto;
    private String jobtitle;

    // Constructors

    /** default constructor */
    public Employee() {
    }

    /** minimal constructor */
    public Employee(Integer employeenumber) {
        this.employeenumber = employeenumber;
    }

    /** full constructor */
    public Employee(Integer employeenumber, String lastname, String firstname,
            String extension, String email, String officecode,
            Integer reportsto, String jobtitle) {
        this.employeenumber = employeenumber;
        this.lastname = lastname;
        this.firstname = firstname;
        this.extension = extension;
        this.email = email;
        this.officecode = officecode;
        this.reportsto = reportsto;
        this.jobtitle = jobtitle;
    }

    // Property accessors
    @Id
    @Column(name = "EMPLOYEENUMBER", unique = true, nullable = false)
    public Integer getEmployeenumber() {
        return this.employeenumber;
    }

    public void setEmployeenumber(Integer employeenumber) {
        this.employeenumber = employeenumber;
    }

    @Column(name = "LASTNAME", length = 50)
    public String getLastname() {
        return this.lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    @Column(name = "FIRSTNAME", length = 50)
    public String getFirstname() {
        return this.firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    @Column(name = "EXTENSION", length = 10)
    public String getExtension() {
        return this.extension;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

    @Column(name = "EMAIL", length = 100)
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "OFFICECODE", length = 10)
    public String getOfficecode() {
        return this.officecode;
    }

    public void setOfficecode(String officecode) {
        this.officecode = officecode;
    }

    @Column(name = "REPORTSTO")
    public Integer getReportsto() {
        return this.reportsto;
    }

    public void setReportsto(Integer reportsto) {
        this.reportsto = reportsto;
    }

    @Column(name = "JOBTITLE", length = 50)
    public String getJobtitle() {
        return this.jobtitle;
    }

    public void setJobtitle(String jobtitle) {
        this.jobtitle = jobtitle;
    }
}

Entity sınıfını inceleyelim.

@Entity : Sınıfın bir entity sınıfı olduğunu belirtir.

@Table : Sınıfın hangi tabloya karşılık geldiğini ve bu tablonun hangi şemada olduğunu belirtir.

@Id : Tablonun birincil anahtarı (primary key) olduğunu belirtir.

@Column : Değişkenin hangi kolona karşılık geldiğini belirtir.

Ayrıca kullanacağımız entity sınıflarını hibernate.cfg.xml dosyasında tanımlamamız gerekiyor. Çünkü Hibernate’in hangi nesneleri saklaması gerektiğini bilmesi gerekir. Bunu da MyEclipse bizim için otomatik olarak yapıyor.

alt text

Hibernate’in tüm özelliklerini kullanmak istiyorsak her entity sınıfında bir tane unique değer olması gerekir. Id isminde veriyorsak getId(), setId() metodlarının erişebilmesi için konfigurasyon dosyasında name=”id” dememiz yeterli olur. Id için set metodunu private yazmamız önerilir. Ayrıca default constructor’ın mutlaka yazılması gerekir. Default constructor private ya da protected olabilir. Sonuçta bu constructor arka planda hibernate tarafından kullanılacaktır.

Şimdi de veri tabanına veri ekleme, silme, güncelleme işlerini yapan test sınıfları yazalım.

package dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Employee;
import factory.HibernateSessionFactory;

public class CreateData {

    public static void main(String[] args) throws Exception {

        Session sess = HibernateSessionFactory.getSession();
        Transaction tr = sess.beginTransaction();
        Employee emp = new Employee();
        emp.setFirstname("Ricardo");
        emp.setLastname("Quaresma");
        emp.setJobtitle("Futbolcu");
        emp.setEmail("[email protected]");
        sess.save(emp);
        tr.commit();
        System.out.println("Başarıyla eklendi");
    }
}

package dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Employee;
import factory.HibernateSessionFactory;

public class UpdateData {
    public static void main(String[] args) throws Exception {
        Session sess = HibernateSessionFactory.getSession();
        Transaction tr = sess.beginTransaction();
        Employee st = (Employee) sess.load(Employee.class, 1);
        st.setFirstname("Simao");
        tr.commit();
        System.out.println("Başarıyla güncellendi");
        sess.close();
    }
}

package dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Employee;
import factory.HibernateSessionFactory;

public class DeleteData {
    public static void main(String[] args) throws Exception {
        Session sess = HibernateSessionFactory.getSession();
        Transaction tr = sess.beginTransaction();
        Employee emp = (Employee) sess.load(Employee.class, 1);
        sess.delete(emp);
        System.out.println("Başarıyla silindi");
        tr.commit();
        sess.close();
    }
}

Sınıfları incelerseniz veri tabanı işlemleri için hiç SQL yazmadık. Hazır metotları çağırdık. Ayrıca örnek olsun diye HQL (Hibernate Query Language) kullanarak personelleri listeleyelim. HQL, Hibernate’in kullandığı, SQL’e benzeyen fakat aynı olmayan bir sorgulama dilidir.

package dao;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import entity.Employee;
import factory.HibernateSessionFactory;

public class ReadData {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        Session sess = HibernateSessionFactory.getSession();
        sess.beginTransaction();
        Query query = sess.createQuery("from Employee");
        List result = query.list();
        Iterator it = result.iterator();
        while (it.hasNext()) {
            Employee emp = (Employee) it.next();
            System.out.print(emp.getFirstname());
            System.out.print("   " + emp.getLastname());
            System.out.print("   " + emp.getJobtitle());
            System.out.println();
        }
    }

Bu makalemde Hibernate’in detaylarına inmeden en basit haliyle kullanımına örnek vermek istedim. Asıl kullanımı ise bu kadar basit değildir. SQL’ler çalışma anında dinamik olarak oluşturulduğu için biraz yavaş çalışan Hibernate’in performans artırımı için çeşitli yöntemler vardır.

Yazar : Erkin Pehlivan

0 Yorum..

Yorum yapmak için "Giriş yapın" yada "Misafir üye" olarak yorum yapabilirsiniz.

Yorum Yap