Pengenalan Data Access Object {4} Implementasi dalam Hibernate
artikel sebelumnya saya bahas tentang implementasi dao dalam java persistence api, dan pada artikel sekarang ini saya akan bahas tentang implementasi dao pada hibernate annotation. kenapa hibernate annotation? kenapa tidak hibernate core saja?
alasa utama saya menggunakan hibernate annotation dibandingkan dengan hibernate core adalah karena menggunakan @annotation yang menurut saya lebih mudah dan lebih elegan dibandingkan kita harus membuat file XML untuk mapping kelas dan tabel
ok, kita langsung saja masuk ke inti masalah. dan masalahnya sama seperti masalah sebelum-sebelumnya yaitu membuat sistem informasi universitas, dan kalo ini menggunakan hibernate annotation. dan seperti biasa pula, saya hanya akan membahas tentang dao untuk entitas fakultas, sedangkan untuk entitas lainnya bisa anda buat sendiri
sekarang tahap pertama adalah kita buat kelas Fakultas terlebih dahulu :
package echo.khannedy.daohibernate.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "table_fakultas")
public class Fakultas implements Serializable {
@Id
@Column(name = "id_fakultas")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "nama_fakultas", nullable = false, length = 45)
private String nama;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Fakultas other = (Fakultas) obj;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 79 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
}
setelah membuat kelas entitas, kita buat konfigurasi hibernate annotation menggunakan file hibernate.cfg.xml yang disimpan pada root package :
<?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.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/database</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<mapping class="echo.khannedy.daohibernate.entity.Fakultas"/>
</session-factory>
</hibernate-configuration>
sekarang saatnya kita buat interface dao untuk kelas entity fakultas diatas :
package echo.khannedy.daohibernate.dao;
import echo.khannedy.daohibernate.entity.Fakultas;
import java.util.List;
public interface FakultasDao {
void insert(Fakultas fakultas);
void update(Fakultas fakultas);
void delete(Fakultas fakultas);
Fakultas getById(Long id);
List<Fakultas> getAll();
}
setelah membuat interface fakultas dao, saatnya kita buas kelas implementasi dari interface fakultas dao diatas :
package echo.khannedy.daohibernate.impl;
import echo.khannedy.daohibernate.dao.FakultasDao;
import echo.khannedy.daohibernate.entity.Fakultas;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class FakultasDaoImpl implements FakultasDao {
private SessionFactory factory;
public FakultasDaoImpl(SessionFactory factory) {
this.factory = factory;
}
public void insert(Fakultas fakultas) {
Session session = factory.openSession();
try {
session.beginTransaction();
session.save(fakultas);
session.getTransaction().commit();
} catch (HibernateException exception) {
session.getTransaction().rollback();
throw exception;
} finally {
session.close();
}
}
public void update(Fakultas fakultas) {
Session session = factory.openSession();
try {
session.beginTransaction();
session.update(fakultas);
session.getTransaction().commit();
} catch (HibernateException exception) {
session.getTransaction().rollback();
throw exception;
} finally {
session.close();
}
}
public void delete(Fakultas fakultas) {
Session session = factory.openSession();
try {
session.beginTransaction();
session.delete(fakultas);
session.getTransaction().commit();
} catch (HibernateException exception) {
session.getTransaction().rollback();
throw exception;
} finally {
session.close();
}
}
public Fakultas getById(Long id) {
Session session = factory.openSession();
try {
session.beginTransaction();
Fakultas fakultas = (Fakultas) session.get(Fakultas.class, id);
session.getTransaction().commit();
return fakultas;
} catch (HibernateException exception) {
session.getTransaction().rollback();
throw exception;
} finally {
session.close();
}
}
public List<Fakultas> getAll() {
Session session = factory.openSession();
try {
session.beginTransaction();
List<Fakultas> list = session.createCriteria(Fakultas.class).list();
session.getTransaction().commit();
return list;
} catch (HibernateException exception) {
session.getTransaction().rollback();
throw exception;
} finally {
session.close();
}
}
}
sebenarnya hampir sama cara pembuatan dao di hibernate annotation dan java persistence api, yang membedakan adalah hibernate menggunakan Session dan SessionFactory sedangkan java persistence api menggunakan EntityManager dan EntityManagerFactory
sekarang kita buat kelas dao factory, dimana pada artikel ini saya ubah namanya menjadi HiberanteUtil :
package echo.khannedy.daohibernate.util;
import echo.khannedy.daohibernate.dao.FakultasDao;
import echo.khannedy.daohibernate.impl.FakultasDaoImpl;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
private static final FakultasDao fakultasDao;
static {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
fakultasDao = new FakultasDaoImpl(sessionFactory);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static FakultasDao getFakultasDao() {
return fakultasDao;
}
}
selesai sudah implementasi dao pada hibernate, saatnya kita uji coba :
package echo.khannedy.daohibernate;
import echo.khannedy.daohibernate.dao.FakultasDao;
import echo.khannedy.daohibernate.entity.Fakultas;
import echo.khannedy.daohibernate.util.HibernateUtil;
public class Main {
public static void main(String[] args) {
// membuat dao
FakultasDao dao = HibernateUtil.getFakultasDao();
// membuat fakultas
Fakultas fakultas = new Fakultas();
fakultas.setNama("Teknik dan Ilmu Komputer");
// menyimpan fakultas
dao.insert(fakultas);
// meload fakultas
fakultas = dao.getById(fakultas.getId());
// menubah nama fakultas
fakultas.setNama("Sastra");
// menyimpan hasil ke database
dao.update(fakultas);
// menghapus dari database
dao.delete(fakultas);
}
}
usai sudah tutorial implementasi dao, dimana saya bahas dalam jdbc, jpa dan hibernate. sebenarnya ada framework yang lebih tinggi dari jdbc namun lebih rendah dari hiberante dan jpa, framework itu adalah apache ibatis. ibatis merupakan framework yang bisa digunakan sebagai framework object relational mapping yang cukup bagus jika anda ingin merasakan kehebatan ORM dan juga native SQL
pada artikel selanjutnya saya akan bahas tentang kecerobohan dalam membuat DAO dan bagaimana solusinya
mantap sekali tutorialnya berguna banget,, btw ecooo bisa tolongin gue nggak, gue ada masalah ama query yang manggil 2 tabel atau lebih di hibernate, katanya ada error dengan agregat fungsi….gimana nihhh ecooo, kira2 bisa dibikinin tutorialnya nggak….thankk ya brooo
gimana caranya menempatkan sessionFactory di filter, sehingga open session maupun transaction rollback di class tersebut, mungkin dengan Local Thread
bang Eko, gimana caranya mapping 2 table trus makenya di join
gimana klu inheritance ?
misal ada kelas yaitu kelas Kendaraan, kelas Motor & kelas Yamaha, dimana Kelas Motor extends ke Kendaraan & Yamaha extends ke Motor.
saya masih bingung, jika berkenan tolong share..
masing-masing kelas nantinya akan di mapping ke table Kendaraan, Motor & Yamaha