Posts tagged ‘Hibernate’
Hibernate Interceptor : Contoh Mempermudah Hidup
Aku memiliki sejumlah class POJO yang di-map ke database. Setiap class tersebut punya atribut “createdDate” dan “updatedDate”. Sesuai namanya, “createdDate” akan menyimpan informasi kapan entitas tersebut dibuat, dan “updatedDate” akan menyimpan informasi kapan entitas tersebut terakhir kali dirubah. Seperti biasanya, aku harus mengisi nilai “createdDate” sebelum aku memanggil save(), dan aku harus mengisi nilai “updatedDate” sebelum memanggil update() atau merge(). Tapi kalau class-nya banyak, lama-lama bosan juga. Kenapa aku tidak mencoba memakai interceptor di Hibernate? Aku mulai dengan membuat sebuah class yang merupakan turunan dari EmptyInterceptor seperti berikut ini:
import java.util.*;
import java.io.*;
import org.hibernate.*;
import org.hibernate.type.Type;
public class TimeInfoInterceptor extends EmptyInterceptor {
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyName, Type[] types) {
for (int i=0; i<propertyName.length; i++) {
if ("createdDate".equals(propertyName[i])) {
state[i] = new Date();
return true;
}
}
return false;
}
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types) {
for (int i=0; i<propertyNames.length; i++) {
if ("updatedDate".equals(propertyNames[i])) {
currentState[i] = new Date();
return true;
}
}
return false;
}
}
Setelah itu, aku tinggal merubah sedikit kode yang berhubungan dengan pembuatan SessionFactory, dimana aku meminta agar seluruh session nantinya akan memakai class interceptor yang baru aku buat.
SessionFactory sessionFactory = new
Configuration().configure().setInterceptor(
new TimeInfoInterceptor()).buildSessionFactory();
Setelah program di-compile, aku mencoba membuat entitas baru dan meng-edit-nya. Kini, “createdDate” dan “updatedDate” secara otomatis sudah di-isi oleh Hibernate. Coding-pun menjadi lebih nyaman lagi.
Hibernate: Model Yang Selalu Berubah
Hibernate tidak harus melakukan mapping dari database ke class Java. Ia juga bisa menghasilkan mapping dari database ke dalam object Map. Sebagai contoh, aku membuat file mapping sebagai berikut:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="Person">
<id name="id" column="PERSON_ID" type="long">
<generator class="native" />
</id>
<property name="firstName" column="FIRSTNAME" type="string"/>
<property name="lastName" column="LASTNAME" type="string" />
<property name="age" column="AGE" type="int" />
</class>
</hibernate-mapping>
Untuk menyimpan data ke tabel PERSON, aku menggunakan kode program sebagai berikut:
SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Map mapPerson = new HashMap();
mapPerson.put("firstName", "Solid");
mapPerson.put("lastName", "Snake");
mapPerson.put("age", 15);
session.save("Person", mapPerson);
session.getTransaction().commit();
Dengan coding seperti di atas, aku tidak perlu menggunakan sebuah class POJO, tapi cukup sebuah HashMap. Untuk memastikan data tersimpan ke database, aku menggunakan kode program seperti berikut:
List lstPersons = session.createQuery("FROM Person").list();
for (int i=0; i<lstPersons.size(); i++) {
Map mapPerson = (Map) lstPersons.get(i);
System.out.println("ID = " + mapPerson.get("id"));
System.out.println("Firstname = " + mapPerson.get("firstName"));
System.out.println("Lastname = " + mapPerson.get("lastName"));
System.out.println("Age = " + mapPerson.get("age"));
}