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 :
org.hibernate.dialect.MySQLInnoDBDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/database username password create-dropsekarang 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 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 getAll() { Session session = factory.openSession(); try { session.beginTransaction(); List 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
mmmmm…… untuk yang delete all ato update all.. gmn yah.. dao na
Mas eko saya juga punya pertanyaan mirip sama bro FUGU.
Misal punya
tabel : Course, Student, courses_take
nah untuk mencari data student yang mengambil course berarti pasti pake inner join.
kalo di hibernate nya sih ga masalah bisa pake SQLQuery, nah bagian DAO nya ini saya bingung.
misal bikin function : public List getStudenttakeCourse(Student st){…}
kan akan aneh dibagian returnnya yang hanya menampilkan list Course saja. ada cara ga biar bisa mereturn 2 penggabungan tabel mas. Tolong ya mas di bantu solusinya. Trims.