Mapping Sederhana
Untuk contoh awal, kita akan melakukan mapping untuk class Category. Class ini hanya memiliki tiga properti saja, id, name, dan description. Berikut adalah kode Javanya.
Untuk contoh awal, kita akan melakukan mapping untuk class Category. Class ini hanya memiliki tiga properti saja, id, name, dan description. Berikut adalah kode Javanya.
public class Category {
private Integer id;
private String name;
private String description;
// getter dan setter
}
Class ini akan kita simpan di database. Berikut struktur tabelnya, ditulis dalam dialek MySQL.
create table Category (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
description VARCHAR(255)
);
Untuk kesederhanaan, kita samakan dulu nama tabel dan nama class. Demikian juga dengan nama property di kode Java dan nama kolom di tabel database. Pada bagian selanjutnya, kita akan lihat bagaimana cara memetakan nama yang berbeda.
JPA mendukung dua cara untuk membuat pemetaan, dengan XML dan Annotation. Kita akan mengambil pendekatan Annotation karena lebih mudah dan sederhana. Dengan pendekatan ini, kita tidak perlu memelihara dua file (Java dan XML). Berikut class Category yang sudah dianotasi.
@Entity
public class Category {
@Id @GeneratedValue
private Integer id;
private String name;
private String description;
}
Konfigurasi JPA
Setelah kita membuat tabel dan class Java, sekarang kita akan membuat konfigurasi JPA. NetBeans 6.1 mempunyai fasilitas yang memudahkan konfigurasi JPA.
Langkah pertama adalah membuat koneksi ke dalam database MySQL dengan menggunakan database tools netbeans. Buka tab service, kemudian expand bagian database. Kalau kita belum mempunyai database, kita bisa membuat database terlebih dahulu dengan melakukan klik kanan di node mysql dan pilih menu create database, beri nama training. Kalau sudah ada database (schema) yang dibuat sebelumnya, node mysql dapat diexpand untuk melihat database tersebut.
Langkah berikutnya adalah membuat koneksi ke dalam database yang sudah dibuat. Expand node mysql, klik kanan di node database training, pilih menu connect. Jangan lupa untuk mencek pilihan “Remember Password”. Koneksi ini nanti akan kita gunakan untuk membuat Persistence Unit.
Persistence Unit adalah konfigurasi yang digunakan oleh JPA untuk meletakkan parameter username, password, url dan dialect yang digunakan untuk melakukan koneksi ke database.
Proses membuat Persistence Unit sangat mudah, pilih menu :
file → new file → persistence → persistence unit
Masukkan koneksi yang sudah dibuat pada langkah sebelumnya di bagian “Database Connection”. Kemudian pilih “Table Generation Strategy” agar ketika kita akan menjalankan aplikasi, semua table akan digenerate dari Entity. Kita akan membahas lebih lanjut tentang Entity di bab berikutnya, tidak perlu bingung dahulu, tenang saja.
Hasil dari Persistence Unit adalah file XML dengan mana persistence.xml dan terletak di package META-INF, isinya seperti berikut ini :
<?xml version="1.0" encoding="UTF8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistenc
e
http://java.sun.com/xml/ns/persistence/persistence_1_0.xs
d">
<persistenceunit
name="latihanPU" transactiontype="
RESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<class>com.artivisi.desktop.model.Group</class>
<class>com.artivisi.desktop.model.Person</class>
<properties>
<property name="toplink.jdbc.user" value="root"/>
<property name="toplink.jdbc.password" value=""/>
<property name="toplink.jdbc.url"
value="jdbc:mysql://localhost:3306/training"/>
<property name="toplink.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
<property name="toplink.ddlgeneration"
value="createtables"/>
</properties>
</persistenceunit>
</persistence>
file persistence.xml diatas sebaiknya dibuat dengan otomatis menggunakan tools dari netbeans, dan jangan dibuat secara manual dengan diketik, karena file xml tersebut case sensitif dan harus benar secara sintask, sehingga kalau diketik manual akan beresiko menghasilkan kesalahan ketik.
Menyimpan dan Mengambil Object
Sekarang, konfigurasi sudah siap. Kita akan mencoba untuk menyimpan dan mengambil object dari database dengan menggunakan JPA.
Demonstrasi sederhana dapat dibuat dengan class sederhana yang memiliki method main, sehingga bisa dijalankan. Berikut kerangkanya.
public class DemoJpa {
public static void main(String[] xx){
}
}
Selanjutnya, kode program kita akan dibuat dalam method main.
EntityManagerFactory
Pertama, kita harus membaca konfigurasi yang sudah kita buat tadi. Konfigurasi yang telah diaktifkan akan menghasilkan object EntityManagerFactory. EntityManagerFactory ini hanya dibuat sekali saja sepanjang aplikasi berjalan.
EntityManagerFactory entityManagerFactory=
Persistence.createEntityManagerFactory("JpaPU");
Secara default, JPA akan mencari file yang bernamapersistence.xml dalam META-INF.
Selanjutnya, kita instankan dulu object Category yang akan disimpan.
// buat object category yang mau disave
Category category = new Category();
category.setName("berita");
category.setDescription("berita hangat");
Menyimpan object ke database
Kita bisa langsung menyimpan object tersebut dengan menggunakan EntityManager JPA. Jangan lupa menggunakan
Transaction.
EntityManager entityManager =
entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(category);
entityManager.getTransaction().commit();
entityManager.close();
EntityManager adalah object sekali pakai. Kita ambil EntityManager dari EntityManagerFactory, gunakan untuk operasi persistence, dan kemudian langsung ditutup.
Siklus hidup EntityManager berbeda dengan EntityManagerFactory. EntityManagerFactory umurnya sama
dengan aplikasi, dibuat satu buah, pada saat aplikasi mulai dijalankan, dan digunakan terus sepanjang aplikasi berjalan.
Kita bisa membagi-pakai (share) EntityManagerFactory ke berbagai object yang berjalan berbarengan (concurrent), karena EntityManagerFactory dibuat secara thread-safe, sehingga aman untuk pemakaian multi-threading. Tapi kita tidak bisa menggunakan EntityManager di banyak objek sekaligus.
Setelah dijalankan, kode di atas akan memasukkan satu record ke tabel Category dalam database.
Mengambil data dari database
Object yang ada dalam database juga bisa diambil dengan cara yang tidak jauh berbeda. Bila kita sudah tahu ID object tersebut, kita bisa langsung mengambilnya dari database.
Kode untuk membuka EntityManager, menjalankan transaction, menyelesaikan transaction (commit), dan menutup EntityManager tidak ditulis, karena sama dengan di atas.
Category c = (Category) entityManager.createQuery(“select
c from Category where c.id=:id”).setParameter("id",
1).getSingleResult();
System.out.println("ID: "+c.getId());
System.out.println("Name: "+c.getName());
Tidak sulit bukan? Kita tidak perlu menulis SQL lagi. Tapi ini tidak berarti kita boleh tidak mengerti SQL. Seperti kita akan lihat pada bagian selanjutnya, pemahaman SQL sangat penting agar kita bisa menggunakan JPA dengan optimal.
Membuat skema database
Pada contoh sebelumnya, kita membuat tabel di database dengan menggunakan perintah SQL langsung di database. Sebetulnya, JPA juga bisa membuatkan tabel untuk kita. Tambahkan baris berikut dalam konfigurasi persistence.xml.
<property name="toplink.ddlgeneration"
value="createtables"/>
Ada beberapa opsi yang bisa digunakan untuk property toplink.ddl-generation ini, yaitu:
• dropandcreatetables: dengan opsi ini, JPA akan membuat semua tabel pada saat inisialisasi EntityManagerFactory. Begitu EntityManagerFactory ditutup, semua tabel akan di-drop.
• create:-tables opsi ini hanya akan membuat tabel pada saat EntityManagerFactory diinisialisasi. JPA tidak men-drop tabel pada saat EntityManagerFactory ditutup.
Selanjutnya kita akan membuat class-class untuk data access object (DAO).
Membuat CategoryDao
Class Category akan memiliki beberapa method, diantaranya:
• save : untuk menyimpan object ke database
• findById : untuk mengambil object dari database berdasarkan ID yang diberikan
Nantinya CategoryDao tidak hanya memiliki dua method saja. Tapi untuk awal, cukup kita pindahkan apa yang ada di class DemoJpa di atas ke dalam CategoryDao.
Berikut kerangka CategoryDao.
public class CategoryDao {
public void save(Category cat){}
public Category findById(Integer id){}
}
Selanjutnya, CategoryDao butuh EntityManagerFactory untuk melakukan interaksi dengan database melalui JPA. Kita berikan EntityManagerFactory melalui setter-injection.
public class CategoryDao {
private EntityManager entityManager;
public void setEntityManager(
EntityManager em) {
this.entityManager = em;
}
}
Menggunakan EntityManager
Selanjutnya, mari kita isi method save. Di dalam method ini harus ada logika untuk menentukan apakah operasi save yang akan dilakukan adalah insert atau update. Konvensi yang digunakan adalah: jika id dari entity masih null maka entity tersebut belum ada di dalam database, sehingga operasi insert yang akan dilaksanakan. Sebaliknya, jika idnya tidak null maka operasi update yang akan dilaksanakan:
public void save(Category cat) {
if(cat.getId()==null){
entityManager.persist(cat);
} else {
entityManager.merge(cat);
}
}
method findById.
public Category findById(Integer id){
return (Category) entityManager.createQuery(
"select g from Group g where g.id=:id")
.setParameter("id", id)
.getSingleResult();
}
Client Code
Kita dapat membuat kode sederhana untuk mengetes kinerja CategoryDao. Buat class DemoDao yang memiliki method main. Isikan kode program berikut dalam method main.
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(“JpaPU”);
CategoryDao categoryDao = new CategoryDao();
categoryDao.setEntityManager(factory.createEntityManager(
));
Category cat = new Category();
cat.setName("Tutorial JPA");
cat.setDescription("Belajar JPA");
categoryDao.save(cat);
Setelah dijalankan, coba periksa isi database.
Untuk mengambil data, kita juga bisa menggunakan method findById. Buat class JpaDemo lengkap dengan method main. Isi method main adalah sebagai berikut.
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(“JpaPU”);
CategoryDao categoryDao = new CategoryDao();
categoryDao.setEntityManager(factory.createEntityManager(
));
Category cat = categoryDao.findById(1);
System.out.println("ID: " + cat.getId());
System.out.println("Name: " + cat.getName());
System.out.println("Description: "+cat.getDescription());
Kode di atas bila dijalankan akan menampilkan tulisan sebagai berikut:
ID: 1
Name: Tutorial JPA
Description: Belajar JPA
Tidak ada komentar:
Posting Komentar