Persistence Sederhana dengan NetBeans Oleh : Eko Zulkaryanto http://zulkaryanto.wordpress.com Sumber : http://jasoet.wordpress.com/2008/11/10/persistence-sederhana-dengan-netbeans-2/ Tutorial ini mengambil ide dari tutorial yang ada di blognya Mas Hendro. Yaitu tentang pengenalan Swing Framework dan Beans Binding. Persistence di Java masuk dalam Java Persistence Api atau JPA. JPA mempunyai kemampuan yang cukup “Mantap” yaitu kita benar-benar tidak berurusan dengan database. “Lho Tablenya gimana ?”. Nah tablenya akan dibuatkan sendiri oleh JPA. Beberapa hal yang perlu diperhatikan : Kita hanya perlu paham pendekatan Object Oriented Table dalam database akan di generate otomatis bedasarkan entity class yang kita buat. Ada beberapa library JPA yang bisa digunakan antara lain TopLink dan Hibernate. Untuk memulainya silahkan buka NetBeans (dalam tutorial ini saya menggunakan NetBeans 6.5 RC 2). Kemudian buat sebuah project baru dan beri nama “TestInventory”. Tipe project yang digunakan adalah Java Aplication. Pastikan untuk meng-uncheck option “Create Main Class”.
Buat sebuah database baru pada MySQL atau JavaDB dan pastikan NetBeans sudah terhubung dengan database tersebut.
Buat sebuah sebuah Persistence Unit pada project yang baru saja dibuat. Persistence Unit dapat di temukan pada New File -> Categori Persistence. Kemudian pastikan koneksi database yang terpilih sesuai dengan database yang tadi kita buat. Untuk library silahkan pilih yang diinginkan tetapi pada tutorial ini saya menggunakan Hibernate.
Kemudian buat dua buah Entity Class yaitu Kategori dan Produk kemudian masukkan dalam Package org.jasoet.model atau sesuai dengan keiinginan. File tipe Entity Class dapat ditemukan pada New File -> Categori Persistence. Kemudian sesuaikan dengan source code dibawah ini. Kelas org.jasoet.model.Kategori //Class org.jasoet.model.Kategori package org.jasoet.model; import import import import import import import import import import
java.beans.PropertyChangeSupport; java.io.Serializable; java.util.List; javax.persistence.Column; javax.persistence.Entity; javax.persistence.GeneratedValue; javax.persistence.GenerationType; javax.persistence.Id; javax.persistence.OneToMany; javax.persistence.Transient;
/** * * @author Deny Prasetyo */ @Entity public class Kategori implements Serializable { @Transient private PropertyChangeSupport changeSupport = new PropertyChangeSuppor t(this); private static final long serialVersionUID = 1263464563453L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", length = 100) private String name; @Column(name = "decription", length = 200) private String description; @OneToMany(mappedBy = "kategori") private List
listProduct; public List getListProduct() { return listProduct; } public void setListProduct(List listProduct) { this.listProduct = listProduct; }
public String getDescription() { return description; } public void setDescription(String description) { String oldValue = this.description; this.description = description; changeSupport.firePropertyChange("description", oldValue, this.des cription); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; changeSupport.firePropertyChange("name", oldValue, this.name); } public Long getId() { return id; } public void setId(Long id) { Long oldValue = this.id; this.id = id; changeSupport.firePropertyChange("id", oldValue, this.id); } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning this method won't work in the case the id fields are not set if (!(object instanceof Kategori)) { return false; } Kategori other = (Kategori) object; if ((this.id == null && other.id != null) || (this.id != n ull && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "org.jasoet.model.Kategori[id=" + id + "]"; } }
Kelas org.jasoet.model.Produk //Class org.jasoet.model.Produk package org.jasoet.model; import import import import import import import import import
java.beans.PropertyChangeSupport; java.io.Serializable; javax.persistence.Column; javax.persistence.Entity; javax.persistence.GeneratedValue; javax.persistence.GenerationType; javax.persistence.Id; javax.persistence.ManyToOne; javax.persistence.Transient;
/** * * @author Deny Prasetyo */ @Entity public class Produk implements Serializable { @Transient private PropertyChangeSupport changeSupport = new PropertyChangeSupport(th is); private static final long serialVersionUID = 134674453247658L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "name", length = 100) private String name; @Column(name = "decription", length = 200) private String description; @Column(name = "price", length = 15) private double price; @ManyToOne private Kategori kategori; public Long getId() { return id; } public void setId(Long id) { Long oldValue = this.id; this.id = id; changeSupport.firePropertyChange("id", oldValue, this.id); } public String getDescription() { return description; } public void setDescription(String description) { String oldValue = this.description; this.description = description; changeSupport.firePropertyChange("name", oldValue, this.description); }
public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; changeSupport.firePropertyChange("name",oldValue,this.name); } public double getPrice() { return price; } public void setPrice(double price) { double oldValue = this.price; this.price = price; changeSupport.firePropertyChange("price", oldValue, this.price); } public Kategori getKategori() { return kategori; } public void setKategori(Kategori kategori) { Kategori oldValue = this.kategori; this.kategori = kategori; changeSupport.firePropertyChange("kategori", oldValue, this.kategori); } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning this method won't work in the case the id fields are not set if (!(object instanceof Produk)) { return false; } Produk other = (Produk) object; if ((this.id == null && other.id != null) || (this.id != null & ;& !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "org.jasoet.model.Produk[id=" + id + "]"; }
} Perhatikan penggunaan anotasi (@blablabla) pada kode diatas anotasi tersebut nantinya akan digunakan untuk menggenerate tabel. Untuk lebih jelas mengenai @Anotasi pada Persistence API silahkan download buku berjudul “Java Persistence with Hibernate” di link-link bagian tutorial pada blog ini. Setelah membuat dua buah entity class kemudian buat dua buah kelas DAO yaitu KategoriDAO dan ProdukDAO. Kelas DAO merupakan Java Class biasa. Dua kelas tersebut nantinya akan digunakan untuk fungsi CRUD (Create, Read, Update, Delete) pada database. Masukkan dua buah kelas tersebut kedalam package org.jasoet.dao Sesuaikan dengan Code dibawah ini. Kelas org.jasoet.dao.KategoriDAO //Class org.jasoet.dao.KetegoriDAO package org.jasoet.dao; import java.util.List; import javax.persistence.EntityManager; import org.jasoet.model.Kategori; /** * * @author Deny Prasetyo */ public class KategoriDAO { private EntityManager em; public KategoriDAO(EntityManager em) { this.em = em; } public void save(Kategori prod) { if (prod.getId() == null) { em.persist(prod); } else { em.merge(prod); } } public void delete(Kategori prod) { em.remove(prod); } public Kategori getKategori(Long id) { return em.find(Kategori.class, id); } public List getProdudct() { return em.createQuery("select p from Kategori p").getResultList(); } } Kemudian untuk Kelas org.jasoet.dao.ProductDAO //Class org.jasoet.dao.ProductDAO package org.jasoet.dao; import java.util.List; import javax.persistence.EntityManager;
import org.jasoet.model.Produk; /** * * @author Deny Prasetyo */ public class ProdukDAO { private EntityManager em; public ProdukDAO(EntityManager em) { this.em = em; } public void save(Produk prod) { if (prod.getId() == null) { em.persist(prod); } else { em.merge(prod); } } public void delete(Produk prod) { em.remove(prod); } public Produk getProduk(Long id) { return em.find(Produk.class, id); } public List getProdudct() { return em.createQuery("select p from Produk p").getResultList(); } } Setelah selesai sekarang kita tinggal membuat main class untuk mengetest apakah program kita telah berjalan dengan baik. Kelas org.jasoet.TestMain //Class org.jasoet.TestMain package org.jasoet; import import import import import import import
javax.persistence.EntityManager; javax.persistence.EntityManagerFactory; javax.persistence.Persistence; org.jasoet.dao.KategoriDAO; org.jasoet.dao.ProdukDAO; org.jasoet.model.Kategori; org.jasoet.model.Produk;
/** * * @author Deny Prasetyo */ public class TestMain { private EntityManagerFactory emf = Persistence.createEntityManagerFact ory("TestInventoryPU");
public void doTest() { EntityManager em = emf.createEntityManager(); KategoriDAO kdao = new KategoriDAO(em); Kategori kat = new Kategori(); kat.setName("Sepatu"); kat.setDescription("Segala Jenis Sepatu dan Sepatu sandal"); ProdukDAO pdao = new ProdukDAO(em); Produk p = new Produk(); p.setKategori(kat); p.setName("Kazoot"); p.setPrice(40000); p.setDescription("Sepatu bermerek"); em.getTransaction().begin(); kdao.save(kat); pdao.save(p); em.getTransaction().commit(); } public void doTestDua(){ EntityManager em = emf.createEntityManager(); ProdukDAO pdao = new ProdukDAO(em); Produk p = pdao.getProduk(1l); System.out.println(p.getName()); System.out.println(p.getKategori().getName()); System.out.println(p.getPrice()); } /** * @param args the command line arguments */ public static void main(String[] args) { TestMain tm = new TestMain(); tm.doTest(); tm.doTestDua(); } } Kita akan membahas kode program pada MainClass diatas. 1. Pada baris awal terdapat deklarasi EntityManagerFactory ini digunakan untuk menjalankan Persistence Library yang sudah di definisikan pada Persistence Unit (persistence.xml) sesuai dengan nama parameter yang dimasukkan dalam hal ini TestInventoryPU; 2. Pada methode doTest() terdapat deklarasi EntityManager yang diambil dari Object EntityManagerFactory. Ketika EntityManager di deklarasikan maka table pada database akan digenerate. 3. Kemudian pada doTest() dilakukan insert satu buah object Kategori dan satu buah object Produk. Perhatikan bagian em.getTransaction().begin() dan em.getTransaction().commit() Ini merupakan pembuka dan penutup Transaction pada database. Sedangkan untuk bagian kdao.save() dan pdao.save() merupakan pemanggilan fungsi untuk menyimpan data. 4. Pada methode doTestDua() isi dari table pada database diambil kemudian ditampilkan. Jalankan program kemudian amati output dan juga table pada database. Segitu dulu posting untuk kali ini. Kalau ada pertanyaan hubungi [email protected]
Inheritance Pada Java Persistence Api (JPA) Oleh : Eko Zulkaryanto Sumber : http://jasoet.wordpress.com/2008/11/12/inheritance-pada-java-persistence-api-jpa/ Pada postingan sebelumnya kita telah sedikit mencoba Java Persistence Api menggunakan NetBeans. Disinggung sedikit bahwa dengan JPA kita bisa buat aplikasi menggunakan database tapi tidak perlu berurusan dengan struktur table ataupun SQL. Table dalam database akan di generate oleh JPA berdasarkan Entity class yang kita definisikan. Sekarang kalau ada yang bertanya. “Kalau Table dalam database digenerate berdasarkan Entity class yang berkonsep OOP. Nah gimana ceritanya kalau Entity Class tersebut menggunakan konsep Inheritance ?”. Lebih baik kita lihat contoh program dibawah ini moga-moga bisa menjawab pertanyaan tersebut oh iya posting ini berdasarkan postingan salah satu blog yang muncul di web wordpress ini. Buat sebuah project baru dengan nama “InheritanceJPA”. Tipe project yang digunakan adalah Java Aplication. Pastikan untuk meng-uncheck option “Create Main Class”. Buat sebuah database baru pada MySQL atau JavaDB dan pastikan NetBeans sudah terhubung dengan database tersebut.
Setelah membuat database dan database tersebut telah terkoneksi dengan NetBeans selanjutnya buat sebuah Persistence Unit dan koneksikan Persistence Unit tersebut dengan database yang telah dibuat.Bisa lihat postingan sebelumnya untuk langkah-langkah diatas.
Sekarang baru kita coba untuk membuat Entity Class. Entity Class yang akan kita buat ada empat yaitu ModelBase, Article, BookArticle dan MagazineArticle dan kalau kita lihat Class diagramnya akan terlihat seperti ini.
Bisa dilihat Class Article turunan dari Class ModelBase sedangkan Class MagazieArticle dan BookArticle turunan dari Class Article. Sekarang coba kita lihat code dari ke empat Class tersebut. Class ModelBase package org.jasoet.model; import import import import import
java.io.Serializable; javax.persistence.GeneratedValue; javax.persistence.GenerationType; javax.persistence.Id; javax.persistence.MappedSuperclass;
/** * * @author Deny Prasetyo */ @MappedSuperclass public abstract class ModelBase implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } Class Article package org.jasoet.model;
import import import import import
javax.persistence.DiscriminatorColumn; javax.persistence.DiscriminatorType; javax.persistence.Entity; javax.persistence.Inheritance; javax.persistence.InheritanceType;
/** * * @author Deny Prasetyo */ @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER, name="ar ticleTypeId") public abstract class Article extends ModelBase { private private private private
String String String String
articleId; title; summary; url;
public String getArticleId() { return articleId; } public void setArticleId(String articleId) { this.articleId = articleId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } Class MagazineArticle package org.jasoet.model; import java.util.Date;
import import import import
javax.persistence.DiscriminatorValue; javax.persistence.Entity; javax.persistence.Temporal; javax.persistence.TemporalType;
/** * * @author Deny Prasetyo */ @Entity @DiscriminatorValue("1") public class MagazineArticle extends Article { private static final long serialVersionUID = 4276734517833727032L; private String publicationName; @Temporal(TemporalType.DATE) private Date publicationDate; public String getPublicationName() { return publicationName; } public void setPublicationName(String publicationName) { this.publicationName = publicationName; } public Date getPublicationDate() { return publicationDate; } public void setPublicationDate(Date publicationDate) { this.publicationDate = publicationDate; } public String getAuthorName() { return authorName; } public void setAuthorName(String authorName) { this.authorName = authorName; } } Class BookArticle package org.jasoet.model; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; /** * * @author Deny Prasetyo */ @Entity @DiscriminatorValue("2") public class BookArticle extends Article {
private private private private
static String String String
final long serialVersionUID = -6145145462382485655L; authorName; publisherName; isbnNumber;
public String getAuthorName() { return authorName; } public void setAuthorName(String authorName) { this.authorName = authorName; } public String getPublisherName() { return publisherName; } public void setPublisherName(String publisherName) { this.publisherName = publisherName; } public String getIsbnNumber() { } public void setIsbnNumber(String isbnNumber) { this.isbnNumber = isbnNumber; } } 1.
2.
Oh ya jangan lupa masukkan ke empat Class tadi kedalam packet org.jasoet.model atau nama yang dianda sukai. Biasakan menamai package dengan nama yang mencerminkan sifat Class-Class yang ada didalamnya. Kemudian daftarkan Class-Class tersebut ke dalam Persistence Unit. Buka file persistence.xml kemudian pilih bagian Design dan pilih tombol “Add Class” kemudian tambahkan semua Class yang sudah dibuat sebelumnya.
Setelah itu buat sebuah Main Class untuk mencoba apakah program kita sudah benar. Class MainClass package org.jasoet; import import import import import
java.util.Calendar; java.util.List; javax.persistence.EntityManager; javax.persistence.EntityManagerFactory; javax.persistence.Persistence;
import import import import
javax.persistence.Query; org.jasoet.model.Article; org.jasoet.model.BookArticle; org.jasoet.model.MagazineArticle;
/** * * @author Deny Prasetyo */ public class MainClass { private EntityManager entityManager; private EntityManagerFactory entityManagerFactory; public MainClass() { entityManagerFactory = Persistence.createEntityManagerFactory("Inheritance JPAPU"); entityManager = entityManagerFactory.createEntityManager(); } public void doTest() { // build and persist a magazine article MagazineArticle ma = new MagazineArticle(); ma.setArticleId("mag-000-001"); ma.setTitle("Magazine Article Title 1"); ma.setSummary("This is a short summary of magazine article 0001..."); ma.setUrl("/path/to/mag-art-0001"); Calendar pubDateCalendar = Calendar.getInstance(); pubDateCalendar.set(2002, 11, 15); ma.setPublicationDate(pubDateCalendar.getTime()); ma.setPublicationName("Harper Collins"); ma.setAuthorName("Dr Doolittle"); entityManager.getTransaction().begin(); entityManager.persist(ma); entityManager.getTransaction().commit(); // build and persist a book article BookArticle ba = new BookArticle(); ba.setArticleId("bk-000-001"); ba.setTitle("Book Article Title 1"); ba.setSummary("This is a short summary of book article 0001..."); ba.setUrl("/path/to/book-art-0001"); ba.setAuthorName("Dr Busybody"); ba.setPublisherName("Tom Collins"); ba.setIsbnNumber("1234-5678"); entityManager.getTransaction().begin(); entityManager.persist(ba); entityManager.getTransaction().commit(); // select all articles Query q = entityManager.createQuery("select a from Article a"); List results = q.getResultList(); for (Article result : results) { System.out.println(result.toString()); }
} public static void main(String[] args) { MainClass mc = new MainClass(); mc.doTest(); } } Jika sudah kemudian jalankan program. Sekarang perhatikan struktur table yang telah dibuat pada database. Ternyata struktur database untuk Entity Class dengan Inheritance menggunakan relasional OnetoOne. Seperti pada gambar dibawah :
Kesimpulan ternyata konsep Inheritance di OOP dapat diterapkan juga di Relational Database dan juga apabila kita menggunakan JPA kita diberi kemudahan karena tidak perlu mendesain table secara manual dan kita hanya perlu paham terhadap konsep OOP.