Senin, 28 November 2011

Mengenal Hibernate pada Object Relational Mapping (ORM)

Hibernate adalah salah satu teknologi object relational persistence mapping (ORM) dan query service. Transformasi persistent data dari sebuah representasi data (relational database) ke sebuah representasi data yang lain (java objects) ataupun sebaliknya adalah fungsi yang sebenarnya dilakukan oleh ORM.

Dalam aplikasi pemrograman yang berorientasi objek, persistence memperbolehkan sebuah objek untuk bisa tetap ada diluar proses aplikasi yang membuatnya (C. Bauer & Gavin King, Manning: Hibernate In Action). State dari objek tersebut disimpan pada datastore dan objek dengan state yang sama suatu saat dapat di buat kembali jika aplikasi dijalankan lagi.

Transient Object adalah object yang dibuat dimana state dari objek ini tidak disimpan pada datastore, sehingga tidak dapat dibuat kembali sebuah objek dengan state yang sama suatu saat. Masa hidup sebuah transient object terbatas pada proses yang membuatnya. Kebanyakan objek pada aplikasi terdiri dari gabungan persistent dan transient objek sehingga diperlukan sebuah sub-sistem yang menangani persistent objek.

Domain model adalah representasi dari business entities yang digunakan dalam aplikasi java. Dalam arsitektur aplikasi yang terbagi menjadi beberapa layer, domain model digunakan untuk menjalankan business logic pada business layer (pada java bukan pada database). Business layer berhubungan dengan persistence layer untuk proses loading dan menyimpan persistent object dari domain model.
ORM adalah middleware pada persistence layer yang menangani persistent object. ORM bukan merupakan satu-satunya solusi permasalahan yang digunakan untuk menangani persistent object, cara lain yang bisa digunakan adalah dengan EJB atau langsung memakai SQL yang mengkopi nilai yang dari JDBC result set pada persistent object di domain model.


Hibernate ditulis dengan menggunakan bahasa pemrograman java meskipun saat ini juga dikembangkan untuk mendukung .NET framework. Persistent object dapat dibuat menggunakan hibernate dengan idiom bahasa pemrograman java termasuk didalamnya association, inheritance, polymorphism, composition, java collection framework seperti Set, List, Map. Hibernate adalah free software yang menggunakan lisensi LGPL.

Hibernate mendukung banyak DBMS (Database Management System) antara lain Oracle, DB2, MySQL, PostgreSQL, Sybase, SAP DB, HypersonicSQL, Microsoft SQL Server, Posgress, McKoi SQL, Pointbase dan Interbase. Hibernate dapat diintegrasikan dengan Framework-framework java yang lain seperti JBoss (hibernate sekarang merupakan bagian dari JBoss Project), Spring Framework, Struts, JSF maupun framework java yang lain sebagai persistence layer.

Object Oriented Query Language (OOQL) yang digunakan oleh hibernate mendefinisikan join table sebagai object property path. Selain itu OOQL mendukung fungsi dan operator SQL, fungsi aggregat seperti sum, avg, min, max, count. OOQL mendukung fungsi group by, having dan order by. Hibernate juga mendukung sub query (sub select pada database). Query yang dihasilkan oleh hibernate mengembalikan nilai berupa Objek atau nilai skalar.

Hibernate memiliki beberapa interface Sekumpulan Application Programming Interface (API) yang digunakan oleh business layer yaitu:
  • Interface yang digunakan untuk melakukan operasi CRUD dan Query. Interface ini merupakan main point antara business logic dengan Hibernate. Interface tersebut adalah Session, Transaction dan Query.
  • Interface yang digunakan oleh aplikasi untuk melakukan konfigurasi Hibernate, yang paling penting adalah class Configuration
  • Callback Interface yang digunakan oleh aplikasi untuk event yang yang terjadi didalam Hibernate seperti Interceptor, Lifecycle, dan Validatable.
  • Interface yang merupakan implementasi mapping Hibernate seperti UserType, CompositeUserType, dan IdentifierGenerator
  • SessionFactory, factory untuk Session, client dari ConnectionProvider.
  • Session, class yang digunakan antara aplikasi dengan database. Session mengelola object untuk aplikasi. Session adalah wrapper dari sebuah koneksi JDBC
  • Persistent Object & Collections, object yang memiliki persistent state dan bisnis proses, bisa berupa JavaBean. Persistent Object & Collection selalu mempunyai 1 Session.
  • Transient Object & Collections, merupakan instance dari persistent class yang tidak terkait dengan Session. Transient Object & Collections bisa berupa object yang di buat oleh aplikasi yang di-persistent-kan. Atau obyek yang session telah di tutup (closed session).
  • Transaction, object yang digunakan oleh aplikasi untuk menspesifikasikan unit kerja yang atomic. Transaction adalah abstraksi dari JDBC, JTA atau CORBA Transaction. Sebuah Session dapat memiliki lebih dari 1 Transaction.
  • ConnectionProvider, yaitu abstraksi dari DataSource atau DriverManager. ConnectionProvider tidak di bisa diakses langsung oleh business layer.
  • TransactionFactory, factory untuk Transaction
Sebuah instance dari Datastore adalah representasi dari keseluruhan mapping antara objek-objek java ke database relasional. Mapping di compile dari berbagai file mapping yang berformat xml. Sebuah instance dari Datastore dapat dibuat dengan memanggil fungsi Hibernate.createDatastore().

Contoh program Hybernate : 
Hibernate dapat mengenali sebuah domain model dengan berbagai cara, yang pertama adalah membuat file mapping yang berupa xml (dinamai standar xxx.hbm.xml) atau meregister langsung dari java class. Cara terbaik adalah dengan membuat file mapping, karena kita akan lebih melihat relasi antar class-class model seperti kalau kita mendesain sebuah Entity Relation Diagram database. Berikut ini adalah file mapping User.hbm.xml kali ini kita menggunakan tabel tanpa relasi dengan tabel yang lain.


Selanjutnya adalah mengenerate File java class dengan menggunakan bantuan Middlegen atau dengan menggunakan hibernate versi 2 (hibernate versi 3.0 ke atas tidak menyediakan tool untuk mengenerate file class java). berikut ini merupakan file User.java hasill generate dari User.hbm.xml


Selanjutnya adalah melakukan generate file sql yang digunakan untuk membuat Table dalam database. Karena perintah SQL ada yang spesifik menurut database, maka perlu didefinisikan file hibernate.properties. Dalam contoh ini digunakan database MySQL. Berikut ini adalah konfigurasi file hibernate.properties:


File hibernate.properties ini nantinya juga akan digunakan dalam aplikasi, untuk saat ini digunakan untuk melakukan generate DDL SQL. set nilai parameter hibernate.show_sql menjadi "true" untuk menentukan apakah statement DDL SQL yang dibuat hibernate ditampilkan. hibernate.dialect digunakan untuk menentukan dialect SQL database yang digunakan. Hibernate menyediakan AntTask yang bisa digunakan untuk mengenerate file DDL SQL, yaitu class org.hibernate.tool.hbm2ddl.SchemaExportTask atau bisa menjalankan class org.hibernate.tool.hbm2ddl.SchemaExport dari program java atau bisa juga menggunakan Middlegen maupun XDoclet. Berikut ini adalah file DDL SQL hasil generate:


Selanjutnya adalah membuat class Data Akses Object yang digunakan untuk mengakses field-field yang ada di table users. Yang pertama kali harus dlakukan adalah membuat SessionFactory, sebelum SessionFactory dibuat terlebih dahulu harus melakukan membuat instance dari class org.hibernate.cfg.Configuration yang digunakan untuk melakukan konfigurasi file-file hbm.xml dan lainnya. berikut ini adalah potongan program untuk inisialisasi hibernate:


Berikut ini adalah contoh code program yang digunakan untuk menyimpan Object User ke database:

Session sess = factory.openSession();
Transaction transac = sess.beginTransaction();
User user = new User();
//set properties user kecuali userCode karena usercode akan digenerate langsung oleh
//hibernate. Lihat kembali konfigurasi file User.hbm.xml diatas
user.setUserName("heru");
.
.
user.setDescription("coba coba pake hibernate");
sess.save(user);
transac.commit();

sess.close(); 

Berikut ini contoh code program untuk melakukan update user:

// update user dengan code = 1
Session sess = factory.openSession();
Transaction trx = sess.beginTransaction();
User user = (User) sess.load(User.class, new Long(1));
user.setUserName("heru eko susanto") ;
trx.commit();
sess.close();

Tidak ada komentar:

Posting Komentar