Dian's Blog

{ while (true) { doLearning(); } }

Loading...

Hibernate Event Listener

Posted on 19 September 2010 by Dian Aditya

Barusan saya baca-baca tentang database trigger dan sempat coba-coba, malas juga ternyata nulis kodenya yang begitu banyak :p benar-benar programmer yang buruk, hehehehe... Dan seperti apa yang saya inginkan, tuink... sangat tepat, ternyata hibernate juga menyediakan fasilitas yang mirip seperti trigger pada database, yaitu Hibernate Event. Sebuah mekanisme yang akan otomatis dijalankan apabila pemicu dipanggil. Untuk penjelasan lebih lanjut tentang event dan trigger bisa lihat di sini dan di sini (lagi-lagi males nulis :p).

Langsung saja ke kasusnya...

Saya mempunyai dua buah entity yaitu Produk dan CatatanAktivitasProduk. Dan saya akan membuat sebuah mekanisme agar hibernate secara otomatis manambahkan baris data pada CatatanAktivitasProduk ketika user melakukan transaksi (CRUD) data terhadap table Produk. Baris data berupa tanggal transaksi, aktivitas (lihat, tambah, perbarui, ataupun hapus), dan id produk yang terpengaruh akibat transaksi yang dilakukan oleh user tersebut.

Pertama berikut entity yang saya butuhkan.

  1: package com.mervpolis.dwx.hibernate.entity;
  2: 
  3: import javax.persistence.Column;
  4: import javax.persistence.Entity;
  5: import javax.persistence.GeneratedValue;
  6: import javax.persistence.GenerationType;
  7: import javax.persistence.Id;
  8: import javax.persistence.Table;
  9: 
 10: @Entity
 11: @Table
 12: public class Produk {
 13: 
 14: 	@Id
 15: 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 16: 	private long id;
 17: 
 18: 	@Column
 19: 	private String nama;
 20: 
 21: 	@Column
 22: 	private long harga;
 23: 
 24: 	@Column
 25: 	private String deskripsi;
 26: 
 27: 	public long getId() {
 28: 		return id;
 29: 	}
 30: 
 31: 	public void setId(long id) {
 32: 		this.id = id;
 33: 	}
 34: 
 35: 	public String getNama() {
 36: 		return nama;
 37: 	}
 38: 
 39: 	public void setNama(String nama) {
 40: 		this.nama = nama;
 41: 	}
 42: 
 43: 	public long getHarga() {
 44: 		return harga;
 45: 	}
 46: 
 47: 	public void setHarga(long harga) {
 48: 		this.harga = harga;
 49: 	}
 50: 
 51: 	public String getDeskripsi() {
 52: 		return deskripsi;
 53: 	}
 54: 
 55: 	public void setDeskripsi(String deskripsi) {
 56: 		this.deskripsi = deskripsi;
 57: 	}
 58: 
 59: }
  1: package com.mervpolis.dwx.hibernate.entity;
  2: 
  3: import java.sql.Timestamp;
  4: 
  5: import javax.persistence.Column;
  6: import javax.persistence.Entity;
  7: import javax.persistence.GeneratedValue;
  8: import javax.persistence.GenerationType;
  9: import javax.persistence.Id;
 10: import javax.persistence.JoinColumn;
 11: import javax.persistence.ManyToOne;
 12: import javax.persistence.Table;
 13: 
 14: @Entity
 15: @Table
 16: public class CatatanAktivitasProduk {
 17: 
 18: 	@Id
 19: 	@GeneratedValue(strategy=GenerationType.IDENTITY)
 20: 	private long id;
 21: 
 22: 	@ManyToOne
 23: 	@JoinColumn(name = "produk_id")
 24: 	private Produk produk;
 25: 
 26: 	@Column
 27: 	private String aktivitas;
 28: 
 29: 	@Column
 30: 	private Timestamp tanggal;
 31: 
 32: 	public long getId() {
 33: 		return id;
 34: 	}
 35: 
 36: 	public void setId(long id) {
 37: 		this.id = id;
 38: 	}
 39: 
 40: 	public Produk getProduk() {
 41: 		return produk;
 42: 	}
 43: 
 44: 	public void setProduk(Produk produk) {
 45: 		this.produk = produk;
 46: 	}
 47: 
 48: 	public String getAktivitas() {
 49: 		return aktivitas;
 50: 	}
 51: 
 52: 	public void setAktivitas(String aktivitas) {
 53: 		this.aktivitas = aktivitas;
 54: 	}
 55: 
 56: 	public Timestamp getTanggal() {
 57: 		return tanggal;
 58: 	}
 59: 
 60: 	public void setTanggal(Timestamp tanggal) {
 61: 		this.tanggal = tanggal;
 62: 	}
 63: 
 64: }

Dan selanjutnya adalah membuat listenernya yang akan otomatis melakukan aksi ketika user melakukan CRUD terhadap table Produk. Untuk contoh saya akan membuat listener yang akan menjalankan event setelah user melakukan insert data terhadap table Produk.

  1: package com.mervpolis.dwx.hibernate.event;
  2: 
  3: import java.sql.Timestamp;
  4: 
  5: import org.hibernate.Session;
  6: import org.hibernate.event.PostInsertEvent;
  7: import org.hibernate.event.PostInsertEventListener;
  8: 
  9: import com.mervpolis.dwx.hibernate.entity.CatatanAktivitasProduk;
 10: import com.mervpolis.dwx.hibernate.entity.Produk;
 11: 
 12: public class ProdukEventListener implements PostInsertEventListener {
 13: 
 14: 	@Override
 15: 	public void onPostInsert(PostInsertEvent event) {
 16: 		if (event.getEntity() instanceof Produk) {
 17: 			CatatanAktivitasProduk aktivitasProduk = new CatatanAktivitasProduk();
 18: 			Session session = event.getSession();
 19: 
 20: 			aktivitasProduk.setAktivitas("tambah");
 21: 			aktivitasProduk.setProduk((Produk) event.getEntity());
 22: 			aktivitasProduk
 23: 					.setTanggal(new Timestamp(System.currentTimeMillis()));
 24: 
 25: 			session.saveOrUpdate(aktivitasProduk);
 26: 		}
 27: 	}
 28: 
 29: }

Selanjutnya adalah mendaftarkan listener pada konfigurasi hibernate (hibernate.cfg.xml).

  1: <?xml version="1.0" encoding="UTF-8"?>
  2: <!DOCTYPE hibernate-configuration PUBLIC
  3: 		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4: 		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5: <hibernate-configuration>
  6:     <session-factory>
  7:         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8:         <property name="hibernate.connection.password">admin</property>
  9:         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
 10:         <property name="hibernate.connection.username">root</property>
 11:         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
 12:         <property name="hibernate.hbm2ddl.auto">update</property>
 13:         <property name="hibernate.show_sql">true</property>
 14: 
 15: 		<mapping class="com.mervpolis.dwx.hibernate.entity.Produk"/>
 16: 		<mapping class="com.mervpolis.dwx.hibernate.entity.CatatanAktivitasProduk"/>
 17: 
 18: 		<listener class="com.mervpolis.dwx.hibernate.event.ProdukEventListener" type="post-insert"/>
 19:     </session-factory>
 20: </hibernate-configuration>

Selanjutnya saya akan mencoba menjalankan sebuah kode yang akan melakukan insert data terhadap table produk.

  1: package com.mervpolis.dwx.hibernate;
  2: 
  3: import org.hibernate.Session;
  4: import org.hibernate.SessionFactory;
  5: import org.hibernate.cfg.AnnotationConfiguration;
  6: 
  7: import com.mervpolis.dwx.hibernate.entity.Produk;
  8: 
  9: public class InsertData {
 10: 	public static void main(String[] args) {
 11: 		SessionFactory factory = new AnnotationConfiguration().configure()
 12: 				.buildSessionFactory();
 13: 		Session session = factory.openSession();
 14: 
 15: 		Produk produk = new Produk();
 16: 
 17: 		session.getTransaction().begin();
 18: 		produk.setNama("Sendal Jepit");
 19: 		produk.setHarga(2000);
 20: 		produk.setDeskripsi("Sendal yang dijepit");
 21: 		session.saveOrUpdate(produk);
 22: 		session.getTransaction().commit();
 23: 	}
 24: }
 25: 

Dan apa yang terjadi ketika kode diatas saya jalankan? Secara otomatis hibernate akan menjalankan perintah yang saya taruh pada listener. Nahlho mana buktinya? Ada baiknya bila anda buktikan sendiri dengan mencoba membuat mekanisme seperti di atas :) selamat mencoba.