Monday, June 16, 2014

Hibernate OGM

Hibernate OGM (Object Grid Mapper) merupakan persistence framework untuk NoSQL datastore (seperti MongoDB). Berbeda dengan Hibernate ORM yang khusus untuk relational database seperti MySQL, Oracle, postgresql dll.
Sayang sekali versi yang terakhir direlease masih Beta (belum final atau stable), yakni 4.1.0.Beta4. Jadi kemungkinan masih banyak kekurangan dan perlu banyak pengembangan.
Jika kita sudah familiar dengan JPA tentunya akan lebih mudah untuk menggunakan framework ini.
Untuk dokumentasi lebih lengkapnya bisa dilihat disini.

Sekarang kita mulai saja dengan contohnya.

Database yang akan digunakan adalah MongoDB.
Start mongoDB admin dan client nya
 $ mongod  
 $ mongo  

Create java project dengan struktur maven. Tambahkan library MongoDB driver dan MongoDB hibernate OGM di pom.xml
 <dependency>  
       <groupId>org.mongodb</groupId>  
       <artifactId>mongo-java-driver</artifactId>  
       <version>2.12.2</version>  
 </dependency>  
 <dependency>  
       <groupId>org.hibernate.ogm</groupId>  
       <artifactId>hibernate-ogm-mongodb</artifactId>  
       <version>4.1.0.Beta3</version>  
     </dependency>  


Tambahkan library core untuk Hibernate OGM
 <dependency>  
       <groupId>org.hibernate.ogm</groupId>  
       <artifactId>hibernate-ogm-core</artifactId>  
       <version>4.1.0.Beta4</version>  
     </dependency>  
     <dependency>  
       <groupId>org.hibernate.ogm</groupId>  
       <artifactId>hibernate-ogm-infinispan</artifactId>  
       <version>4.1.0.Beta4</version>  
     </dependency>  

Create satu contoh domain entity class. Misalnya class Employee. Hampir sama dengan hibernate ORM, karena kita memakai standart JPA.

 @Entity  
 public class Employee {  
   @Id  
   @GeneratedValue(strategy = GenerationType.AUTO)  
   private Integer id;  
   @Column(name = "firstname")  
   private String firstname;  
   @Column(name = "lastname")  
   private String lastname;  
   @Column(name = "phone")  
   private String phone;  
   ……       
 }  


Create persistence.xml di resource/META-INF yang berisi daftar class mapping dan koneksi ke datastrore.

Jangan lupa providernya diset  “org.hibernate.ogm.jpa.HibernateOgmPersistence”.
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
 <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">  
 <persistence-unit name="samplePersistenceUnit" transaction-type="RESOURCE_LOCAL">  
   <!-- Use Hibernate OGM provider: configuration will be transparent -->  
   <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>  
   <class>com.andri.hibernate.sample.persistence.domain.Employee</class>  
   <class>com.andri.hibernate.sample.persistence.domain.Address</class>  
   <properties>  
       <!-- Configure Hibernate OGM to mount Infinispan -->  
       <property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/>  
       <property name="hibernate.ogm.datastore.database" value="sample-mongo-test"/>  
       <property name="hibernate.ogm.datastore.host" value="localhost"/>  
       <property name="hibernate.search.default.directory_provider" value="filesystem"/>  
       <property name="hibernate.search.default.indexBase" value="/tmp/.hibernate_ogm_demo_luceneindexes"/>  
       <property name="hibernate.ogm.datastore.grid_dialect" value="org.hibernate.ogm.datastore.mongodb.MongoDBDialect" />  
   </properties>  
   </persistence-unit>  
 </persistence>  

Create sample class DAO yang mengimplementasikan proses CRUD untuk domain yang sudah kita buat tadi (persist, merge, delete).
 public class EmployeeDao {  
   private EntityManagerFactory emf = Persistence.createEntityManagerFactory("samplePersistenceUnit");  
   private EntityManager em = emf.createEntityManager();  
   public void save(Employee employee){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       transaction.begin();  
       em.persist(employee);  
       transaction.commit();  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public void update(Employee employee){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       if(findById(employee.getId())!=null) {  
         transaction.begin();  
         em.merge(employee);  
         transaction.commit();  
       }  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public void delete(Employee employee){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       if(findById(employee.getId())!=null) {  
         transaction.begin();  
         em.remove(employee);  
         transaction.commit();  
       }  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public void deleteById(Integer id){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       Employee find = findById(id);  
       if(find != null) {  
         transaction.begin();  
         em.remove(find);  
         transaction.commit();  
       }  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public Employee findById(Integer id) {  
     try {  
       return em.find(Employee.class, id);  
     } catch (Exception ex) {  
       System.out.println("Could not find Employee with id: " + id + "; " + ex.getMessage());  
     }  
     return null;  
   }  
   public EntityManager getEntityManager() {  
     return em;  
   }  
 }  

Create Test class untuk mencoba proses CRUD di dao.
 public class EmployeeDaoTest {  
   private EmployeeDao employeeDao = new EmployeeDao();  
   @Test  
   public void testInsert(){  
     Employee employeeFirst = new Employee();  
     employeeFirst.setFirstname("Andri");  
     employeeFirst.setLastname("Sasuke");  
     employeeFirst.setPhone("0817777");  
     Employee employeeSecond = new Employee();  
     employeeSecond.setFirstname("Budi");  
     employeeSecond.setLastname("Ini");  
     employeeSecond.setPhone("081888");  
     employeeDao.save(employeeFirst);  
     employeeDao.save(employeeSecond);  
     Assert.assertTrue(employeeFirst.getId()!=null && employeeSecond.getId()!=null);  
   }  
   ………..  
 }  

Masuk mongoDB client,  dapat dilihat data yang kita insert masuk.
Dengan perintah : $ db.Employee.find()


Data formatnya JSON. Kalau di MongoDB table dianggap menjadi sebuah Collection da nisi datanya formatnya JSON.
Untuk spesifikasi lebih lanjut tentang MongoDB bisa diliat di sini.

Untuk proses select query saya masih belum menemukan caranya. Jika digunakan query JP-QL ternyata masih error. Kalo dibaca baca di documentasinya mungkin bisa menggunakan Hibernate Search.

Source code tutorial ini bisa dilihat di sini : https://github.com/andrisasuke/sample-hibernate-ogm-mongoDB

Mungkin kedepannya tutorial ini bisa dilengkapi dengan Spring atau Spring MVC

Selamat mencoba dan maaf atas kekurangannya. J


No comments:

Post a Comment