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.
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 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