3 Ağustos 2011 Çarşamba

Hibernate ile Java Projesi Geliştirme ve Inner Join Sorgusunu Gerçekleme

Herkese merhabalar,

Castor üzerinde uzunca bir süre çalıştıktan sonra, artık sıra popüler framework Hibernate'yi öğrenmeye gelmişti. Bu hafta başında çalışmaya başladığım Hibernate'de güzel tecrübeler elde ettim. Aşağıda Hibernate ile geliştirilmiş bir Java projesi var, bunu inceleyelim. Burada ilk gerçeklediğim örneklerden ziyade, son olarak yaptığım projeyi koymayı uygun gördüm, basitten değil de zordan başlamayı denemek lazım bir sefer de :)

Hibernate iyidir hoştur, basit select, insert, update ve delete querylerimizi çalıştırır sağolsun da, işim içine obje ilişkileri girdi mi biraz durum farklılaşıyor. Mesela iki adet tablonuz var ve bunlar arasında bir ilişki kurarak bir sorgu hazırlayacaksınız(mesela select * from t1 inner join t2 ... gibi). Bunu gerçeklerken öncekilerden farklı olarak SQL querysini olduğu gibi Java kodları arasına yazmamız gerekiyor, diğer türlü bu işlem gerçekleşmiyor. Query sınıfıyla yapınca inner join ... on ... kalıbını tanımıyor, bilmiyorum bu konuyu çözmek adına birşey yaptılar mı, dolayısıyla bu sorunu SQLQuery sınıfıyla çözüyoruz. Aşağıda daha net biçimde görülebilir.


Bu projede kullanılan kütüphaneleri de yazmakta fayda var, zira bazen eski ve yeni versiyon kütüphaneler bir arada çalışırken sıkıntı olabiliyor, doğru kütüphaneleri kullanmak burada önem kazanıyor.

- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- hibernate3.jar
- javassist-3.9.0.GA.jar
- jta-1.1.jar
- ojdbc14.jar(Kullandığım veritabanı Oracle olduğu için bunu kullanıyorum, diğer veritabanları için farklı kütüphaneleri Google'dan bulabilirsiniz.)
- slf4j-api-1.5.8.jar
- slf4j-simple-1.5.8.jar

Şimdi gelelim kodlara.

Car.Java

package com.emre.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
 * @author gozenem
 *
 */
@Entity
@Table(name="CAR")
public class Car {
       @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")
    private int id;   
    @Column(name="BRAND", nullable=false)
    private String brand;  
    @Column(name="MODEL")
    private String model;   
    @Column(name="PRODUCTIONDATE")
    private Date productionDate;  
    @Column(name="AMOUNT")
    private int amount;
    public Car(String brand, String model, Date productionDate, int amount) {
        super();
        this.brand = brand;
        this.model = model;
        this.productionDate = productionDate;
        this.amount = amount;
    }
    public Car() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
    public Date getProductionDate() {
        return productionDate;
    }
    public void setProductionDate(Date productionDate) {
        this.productionDate = productionDate;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }   
    public void updateCar(Car car){
        this.amount = car.amount;
        this.brand  = car.brand;
        this.model = car.model;
        this.productionDate = car.productionDate;
    }
}



City.Java

package com.emre.model;

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

@Entity
@Table(name="CITY")
public class City {     private long id;     
    private String name;
    public City(String name) {
        super();
        this.name = name;
    }
    public City() {}
    @Id
    @GeneratedValue
    @Column(name="CITY_ID")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    @Column(name="CITY_NAME", nullable=false)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


CarDAO.Java
package com.emre.dao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.PropertyValueException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.emre.model.Car;
import com.emre.model.City;
import com.emre.util.HibernateUtil;
public class CarDAO {
    private Session session;
    public void addCar(Car car){
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            session.save(car);
            session.getTransaction().commit();
        }
        catch(PropertyValueException ex){
            System.out.println("Marka boş olamaz !");
        }
        catch(HibernateException ex){
            session.getTransaction().rollback();
            ex.printStackTrace();
        }
        finally{
            session.close();
        }
    }
    public void deleteCar(int id){
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            Car car = (Car) session.get(Car.class, id);
            session.delete(car);
            session.getTransaction().commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    }
    public void updateCar(int id, Car newCar){
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            Car car = (Car) session.get(Car.class, id);
            car.updateCar(newCar);
            session.getTransaction().commit();
            session.flush();
            session.close();
        }
        catch(PropertyValueException ex){
            System.out.println("Marka boş olamaz !");
        }
        catch (HibernateException e) {
            // TODO Auto-generated catch block
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    }
    @SuppressWarnings("finally")
    public Car searchCar(int id){
        Car car = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            car = (Car) session.get(Car.class, id);
            session.getTransaction().commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            return car;
        }
    }
    @SuppressWarnings({ "unchecked", "finally" })
    public ArrayList<Object[]> searchCarList(){
        ArrayList<Object[]> cars = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            SQLQuery query = session.createSQLQuery("Select * from Car c inner join City ci on c.Id = ci.City_Id");
            query.addEntity(Car.class);
            query.addEntity(City.class);
            cars = (ArrayList<Object[]>) query.list();
            session.getTransaction().commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            session.close();
            return cars;
        }
    }
}



HibernateUtil.Java
package com.emre.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import com.emre.model.Car;
import com.emre.model.City;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;  
    static {
        try {
            sessionFactory = new AnnotationConfiguration()
                                .configure()
                                .addPackage("com.emre.model")
                                .addAnnotatedClass(Car.class)
                                .addAnnotatedClass(City.class)
                                .buildSessionFactory();
           
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">URLniz</property>
        <property name="hibernate.connection.username">Kullanıcı Adınız</property>
        <property name="hibernate.connection.password">Şifreniz</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="show_sql">true</property>
        <property name="dialect">org.hibernate.dialect.OracleDialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>   <!-- Otomatik tablo olusturma -->
        <!-- Mapping files -->
<!--         <mapping class="Student" /> -->
    </session-factory>
</hibernate-configuration>



Main.Java
package com.emre.main;
import java.util.ArrayList;
import java.util.Date;
import java.util.List
import com.emre.dao.CarDAO;
import com.emre.model.Car;
import com.emre.model.City;
public class Main {
    public static void main(String[] args) {
        CarDAO cDao = new CarDAO();
        ArrayList<Object[]> cars = cDao.searchCarList();
    }
}


Annotations ile ilgili güzel bir link aşağıda.
http://www.jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause 

Ayrıca, yukarıdaki projeyi geliştiriken faydalandığım linki de vermeden geçmek olmaz.
http://loianegroner.com/2010/06/hibernate-3-annotations-tutorial/ 

Kafanıza takılan birşeyler olursa sorabilirsiniz. Herkese kolay gelsin.

Hiç yorum yok:

Yorum Gönder