Pessimistic VS Optimistic Locking


guys, malam ini saya mau bagi2 daging (baca: ilmu) nih, seputar database, pessimistic dan optimistic locking.

#PessimisticLocking

langsung aja ke contoh kasus:
– ada sebuah aplikasi inventory, dimana bisa diakses oleh beberapa user secara bersamaan
– misal saat ini sedang diakses oleh 2 user, user A dan user B

mereka berdua melakukan hal ini secara bersamaan :

A meload data barang dengan id 001 (nama: Dodol)
B meload data barang dengan id 001 (nama: Dodol)

A mengubah nama barang (id 001) menjadi Dodol Garut
B mengubah nama barang (id 001) menjadi Dodol Subang

A refresh data barang, yang didapat Dodol Subang 😦
B refresh data barang, yang didapat Dodol Subang πŸ˜€

kasus diatas dinamakan pessimistic locking, yang artinya siapa yang terakhir mengubah data barang, maka dia yang menang! #yeah!!!

apakah ada yang salah? sebenarnya gak ada yang salah, cuma secara kode etik (alah ngomong apa sih) sebenarnya bermasalah, ketika sebelum si B mengubah nama barang menjadi Dodol Subang, dia seharusnya tahu kalo nama barang telah berubah ke Dodol Garut, dengan begitu ada kemungkinan dia tidak akan jadi mengubah data nama barang tersebut.

#OptimisticLocking

berbeda dengan pessimistic locking, di Optimistic Locking, siapa yang mengubah pertama kali, maka dialah yang menang, yang terakhir mengubah, dia harus tahu dulu kalo sudah terjadi perubahan.

Jadi jika menggunakan Optimistic Locking kejadiannya akan seperti ini :

A meload data barang dengan id 001 (nama: Dodol)
B meload data barang dengan id 001 (nama: Dodol)

A mengubah nama barang (id 001) menjadi Dodol Garut
B mengubah nama barang (id 001) menjadi Dodol Subang

B mendapatkan error, dan diberitahu kalo data sudah berubah
A senang πŸ˜€

#Contoh
berikut adalah contoh framework yang support optimistic locking :
– Hibernate Framework
– Java Persistence API
– …. silahkan sebutkan di komentar πŸ˜€

Konfigurasi Java Persistence API 2 Tanpa Menggunakan XML


Java Programming

Java Programming

Tadi ada yang bertanya, gimana caranya setting koneksi database secara dinamis di JPA, biasanya kan pake XML, dan setelah dibuild projectnya, maka gak bisa diubah lagi secara dinamis. Dia ingin menggunakan koneksi secara dinamis, jadi pengguna bisa menginputkan koneksi manual melalui form.

Ketika JPA versi 1, hal ini tidak dapat dilakukan. JPA 1 masih menggunakan XML untuk melakukan konfigurasinya. Namun sejak versi JPA 2, kita dapat melakukan konfigurasi secara dinamis tanpa menggunakan XML, Caranya?

Pertama biasanya kita Membuat persistence.xml seperti dibawah ini :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="DynamicJPAPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/sample"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Sekarang hapus bagian konfigurasi koneksi ke database, sehingga menjadi seperti dibawah ini :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="DynamicJPAPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Sekarang, untuk membuat EntityManagerFactory-nya, maka kita perlu menggunakan parameter untuk melakukan koneksi, contohnya dibawah ini :

Map<String, String> map = new HashMap<String, String>();
map.put("javax.persistence.jdbc.url", "jdbc:derby://localhost:1527/sample");
map.put("javax.persistence.jdbc.password", "rahasia");
map.put("javax.persistence.jdbc.driver", "org.apache.derby.jdbc.ClientDriver");
map.put("javax.persistence.jdbc.user", "ekoganteng");

EntityManagerFactory factory = Persistence.createEntityManagerFactory("SamplePU", map);

Dan parameter-parameter tersebut bisa diisi melalui form atau apapun. Selamat mencoba πŸ˜€

Memanfaatkan EntityListener Sebagai Trigger di Java Persistence API


Java Programming

Java Programming

Peralatan yang diperlukan :

  1. Java Development Kit 1.6
  2. Java Persistence API 2.0
  3. Implementasi Java Persistence API 2 (EclipseLink 2.0, OpenJPA 2.0, Hibernate Framework 3.5)

Bagi anda yang biasa menggunakan PL/SQL mungkin sudah biasa menggunakan Trigger di databasenya. Trigger memang sangat berguna, seperti untuk melakukan proses validasi ataupun melakukan proses apapun setelah proses INSERT, UPDATE, dan DELETE terjadi πŸ˜€ Baca lebih lanjut

Membuat Pagination untuk JTable dan Java Persistence API 2


Peralatan yang diperlukan untuk tutorial ini :

  1. Java Development Kit 1.6
  2. NetBeans IDE 6.8
  3. EclipseLink 2 (Terbundle dalam NetBeans IDE 6.8)
  4. MySQL Database Server

Jika seluruh peralatan terlah tersedia, berarti Anda dapat mengikuti tutorial ini πŸ˜€

Membuat Project Java Application

JTable merupakan komponen antar muka tabel / grid yang terdapat pada Java Swing. Untuk membuat aplikasi berbasis antar muka, kita harus membuat project jenis java application pada netbeans, caranya : File -> New Project, setelah itu pada bagian Categories pilih Java dan pada bagian Types pilih Java Application :

Memuat Persistence Unit

Agar proyek yang Anda buat mendukung fitur Java Persistence API, maka Anda harus membuat Persistence Unit. Untuk membuat persistence unit, caranya lewat menu File -> New File, lalu pada bagian Categories pilih Persistence dan pada bagian Types pilih Persistence Unit. Setelah itu klik Next :

Jangan lupa untuk membuat database jika memang database untuk proyek ini belum ada, sehingga pada combo box Database Connection tinggal buat koneksi baru :

Membuat Entity

Dalam sebuah proyek yang menggunakan JPA, tidak ada yang namanya Tabel. seluruh Tabel harus ditransformasikan menjadi Entitas, atau disebut Entity. Misal pada proyek ini kita buat entitas yang sederhana, yaitu entitas data, yang hanya menamping ID dan DATA. Untuk membaut entitas, caranya lewat menu File -> New File, setelah itu pada bagian Categories pilih Persistence, dan pada bagian Types pilih Entity Class. Setelah itu klik Next :

Isi dari entitas Data adalah seperti dibawah ini :

package khannedy.pagination.helper;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author echo
 */
@Entity
@Table(name = "datas")
public class Data implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String data;

    public Long getId() {
	return id;
    }

    public void setId(Long id) {
	this.id = id;
    }

    public String getData() {
	return data;
    }

    public void setData(String data) {
	this.data = data;
    }

    @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 Data)) {
	    return false;
	}
	Data other = (Data) 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 "khannedy.pagination.helper.Data[id=" + id + "]";
    }
}

Membuat TableModel

Dikarenakan kita menggunakan JTable, jadi harus membuat TableModel. TableModel ini digunakan untuk menampung data pada JTable yang memuat data-data enitas Data. Isinya seperti ini :

package khannedy.pagination.helper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author echo
 */
public class TableModelData extends AbstractTableModel {

    private static final long serialVersionUID = 1L;

    private List datas = new ArrayList();

    public void setData(Collection collection) {
	datas.clear();
	datas.addAll(collection);
	fireTableDataChanged();
    }

    public int getRowCount() {
	return datas.size();
    }

    public int getColumnCount() {
	return 2;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
	switch (columnIndex) {
	    case 0:
		return datas.get(rowIndex).getId();
	    case 1:
		return datas.get(rowIndex).getData();
	    default:
		return null;
	}
    }

    @Override
    public String getColumnName(int column) {
	switch (column) {
	    case 0:
		return "Id";
	    case 1:
		return "Data";
	    default:
		return null;
	}
    }
}

Membuat Form

Setelah itu buat Form untuk tampilan antar muka aplikasinya. Untuk membuat Form dalam NetBeans caranya lewat menu File -> New File, setelah itu pada bagian Categories pilih Swing GUI Form dan pada bagian Types pilih JFrame Form. Setelah itu beri nama Form nya, misal Form :

Misal saya membuat tampilan form seperti pada gambar dibawah ini :

Untuk nama-nama komponennya anda bisa melihatnya pada gambar dibawah ini :

Membuat Pagination

Setelah selesai membuat Form, saatnya membuat Pagination. Ini merupakan utilitas yang dapat kita gunakan untuk mempermudah penghalamanan tabel yang akan digunakan. Caranya buat sebuah class java bernama Pagination, isinya seperti pada kode dibawah ini :

package khannedy.pagination.helper;

/**
 *
 * @author echo
 */
public class Pagination {

    private int pageSize;

    private int totalItem;

    private int currentPage;

    public Pagination(int pageSize, int totalItem) {
	this.pageSize = pageSize;
	this.totalItem = totalItem;
    }

    public int getPageSize() {
	return pageSize;
    }

    public int getTotalItem() {
	return totalItem;
    }

    public int getTotalPage() {
	return (totalItem / pageSize) - 1;
    }

    public int getCurrentPage() {
	return currentPage;
    }

    public int getCurrentItem() {
	return currentPage * pageSize;
    }

    public void nextPage() {
	currentPage++;
    }

    public void prevPage() {
	currentPage--;
    }

    public void firstPage() {
	currentPage = 0;
    }

    public void lastPage() {
	currentPage = getTotalPage();
    }

    public boolean isHasNextPage() {
	return currentPage < getTotalPage();
    }

    public boolean isHasPrevPage() {
	return currentPage != 0;
    }
}

Membuat PersistenceHelper

Setelah membuat pagination, sekarang saatnya membuat PersistenceHelper, kelas ini berisikan utilitas yang digunakan untuk mendapatkan EntityManagerFactory-nya JPA 2. Kelas ini bisa juga disebut kelas Database Creator πŸ˜€

package khannedy.pagination.helper;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author echo
 */
public class PersistenceHelper {

    private static final EntityManagerFactory factory;

    static {
	factory = Persistence.createEntityManagerFactory("paginationPU");
    }

    public static EntityManagerFactory getFactory() {
	return factory;
    }
}

Menambahkan Pagination ke Form

Setelah membuat kelas Pagination saatnya membuat Form yang mendukung fotur Pagination. Pertama sebelum menambah fitur pagination, kita harus menambahkan TableModel terlebih dahulu ke JTablenya, sehingga isi konstruktur Form nya seperti bawah ini :

public class Form extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    private TableModelData tableModel;

    /** Creates new form Form */
    public Form() {
        initComponents();

	tableModel = new TableModelData();
	tableData.setModel(tableModel);
    }

Setelah menambahkan TableModel, saatnya meload data dari Persistence ke TableModel, namun syaratnya harus menggunakan pagination, jadi kodenya seperti dibawah ini :

public class Form extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    private TableModelData tableModel;

    private Pagination pagination;

    /** Creates new form Form */
    public Form() {
	initComponents();

	tableModel = new TableModelData();
	tableData.setModel(tableModel);

	// deklarasikan Pagination
	initPagination();

	// refresh data
	refresh();
    }

    public void initPagination() {
	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	try {
	    CriteriaBuilder builder = manager.getCriteriaBuilder();
	    CriteriaQuery query = builder.createQuery(Long.class);

	    Root data = query.from(Data.class);
	    query.select(builder.count(data));

	    int count = manager.createQuery(query).getSingleResult().intValue();

	    pagination = new Pagination(100, count);

	} finally {
	    manager.close();
	}
    }

    public void refresh() {
	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	try {
	    CriteriaBuilder builder = manager.getCriteriaBuilder();
	    CriteriaQuery query = builder.createQuery(Data.class);

	    Root data = query.from(Data.class);
	    query.select(data);

	    List list = manager.createQuery(query).
		    setFirstResult(pagination.getCurrentItem()).
		    setMaxResults(pagination.getPageSize()).getResultList();

	    tableModel.setData(list);

	    buttonNext.setEnabled(pagination.isHasNextPage());
	    buttonPrev.setEnabled(pagination.isHasPrevPage());

	} finally {
	    manager.close();
	}
    }

Setelah itu tambahkan aksi tombolFirst, caranya klik kanan tombolnya lalu pilih Events -> Action -> actionPerformed :

    private void buttonFirstActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.firstPage();
	refresh();
    }

Untuk aksi buttonPrev :

    private void buttonPrevActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.prevPage();
	refresh();
    }

Untuk aksi buttonNext :

    private void buttonNextActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.nextPage();
	refresh();
    }

Untuk aksi buttonLast :

    private void buttonLastActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.lastPage();
	refresh();
    }

Dan jika selesai πŸ˜€

jika dijalankan….

wew kok error 😦

run:
[EL Info]: 2010-04-09 00:30:07.939--ServerSession(1680250)--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
[EL Severe]: 2010-04-09 00:30:07.964--ServerSession(1680250)--Local Exception Stack:
Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:397)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at khannedy.pagination.helper.Form.initPagination(Form.java:43)
        at khannedy.pagination.helper.Form.(Form.java:39)
        at khannedy.pagination.helper.Form$5.run(Form.java:200)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        ... 14 more
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at khannedy.pagination.helper.Form.initPagination(Form.java:43)
        at khannedy.pagination.helper.Form.(Form.java:39)
        at khannedy.pagination.helper.Form$5.run(Form.java:200)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

BUILD STOPPED (total time: 17 seconds)

Tenang, tenang πŸ˜€ Itu cuma Driver MySQL nya belum dimasukkan ke Project. TInggal dimasukkan aja ke project… πŸ˜€ Dan sekarang :

Hmm…. Lumayan..

Dah malam ah, dah ngantuk, tar gak bisa bangun subuh lagi πŸ˜€

See You!!!

Download Source Code

Silahkan download sourcecode tutorial ini –> disini <–

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8


Mau melakukan migrasi dari pure JDBC ke JPA?

Mungkin suatu saat kita akan melakukan migrasi dari aplikasi yang menggunakan JDBC ke JPA, namun yang menjadi permasalahan adalah, tabel-tabel sudah ada di database, dan tidak mungkin membuat ulang tabel-tablenya. Kalaupun mau, paling kita harus membuat entity-entity class nya secara manual, dan mapping nya harus sama dengan tabel yang ada di database. No problem selama banyak tabelnya dibawah 20 :D, tapi bagaiman jika total tabel nya ada 50? 😦 #capekkayaknya

Jika kita menggunakan NetBeans IDE, ini bukan masalah πŸ˜€ Kenapa? Karena NetBeans punya fitur otomatis pembuat class entity dari tabel yang ada di database, jadi kita tidak perlu membuatnya secara manual πŸ˜€ Keren kan!

Bagaimana caranya? Gampang Kok πŸ˜€

Membuat Project Baru

Untuk membuat project baru di NetBeans caranya cukup mudah, tingal lewat menu File -> New Project, maka tinggal kita pilih mau membuat project apa πŸ˜€

Saya anggap anda telah membuat sebuah project baru, atau sebenarnya project yang lama pun tidak mengapa πŸ˜€

Membuat Entity Class Otomatis

Untuk membuat class-class entity secara otomatis, caranya lewat menu File -> New File , atau Ctrl + N. Setelah itu akan muncul dialog, dan pada bagian Categories, pilih Persistence dan pada bagian File Types, pilih Entity Classes from Database :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Setelah itu klik tombol Next untuk melanjutkan, maka akan keluar dialog untuk Database Table, pilihlah koneksi yang akan digunakan pada bagian Database Connection, jika belum tersedia silahkan membuat dulu koneksinya :

Tambahkan tabel-tabel yang sekiranya akan dibuatkan sebuah entity class, misal saya tambahkan semua tabelnya :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Setelah itu klik tombol Next, dan sekarang saatnya di mapping dengan entity class. Ubahlah bagian Class Name dengan nama kelas yang kita inginkan :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

dan jika terdapat warning “The project does not have persistence unit…“, maka klik tombol Create Persistence Unit :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Beri nama persistence unitnya lalu klik tombol Create untuk membuat persistence unit tersebut. Dan sekarang tidak ada warning lagi πŸ˜€ :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Setelah itu klik tombol Next dan sekarang kita harus melakukan konfigurasi relasi antar entitas. Ubah Assosiation Fetch dan Collection Type sesuai dengan yang kita inginkan, misal saya menggunakan fetch dan java.util.List :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Setelah itu klik tombol Finish, dan tunggu sampai selesai :

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Sekarang semua Tabel sudah menjadi Entity Class,

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

Membuat Entity Class JPA dari Database Secara Otomatis Menggunakan NetBeans IDE 6.8

mudah bukan, bahkan kita tidak perlu coding sedikitpun πŸ˜€

“Jangan membeli rumah di lingkungan keputusasaan. Harapan masih ada. Jangan pergi menuju kegelapan. Ada cahaya.”, Jallaludi Rumi.

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8


Sudah dari dulu NetBeans mendukung fitur JPA, dan sejak versi 6.8 sekarang ini, NetBeans telah mendukung penuh JPA 2 dan JEE6. Dan sekarang kita akan belajar membuat aplikasi CRUD menggunakan JPA 2 dibantu oleh NetBeans IDE

Membuat Database

JPA tidak tergantung dengan database, apapun databasenya, anda tetap bisa mempraktekan tutorial ini. Disini saya menggunakan database MySQL. Jadi sebelum membuat aplikasi, kita buat dulu databasenya. Untuk membuat database di MySQL caranya cukup sederhana, tinggal gunakan perintah :

create database crud;

Artinya sekarang saya sudah membuat database dengan nama crud.

Membuat Project

Karena kita akan membuat aplikasi Desktop, jadi kita buat sebuah project Java Application di NetBeans, caranya lewat menu : File -> New Project, lalu pada bagian Categories pilih Java dan bagian Project pilih Java Application. Setelah itu beri nama projectnya, dan jangan lupa untuk otomatis membuat Main Class seperti yang terlihat pada gambar dibawah ini :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Membuat Persistence Unit

Sebelum membuat aplikasi, pertama kita harus membuat Persistence Unit. Caranya pilih File -> New File, lalu pada bagian Categories pilih Persistence dan pada bagian File Types pilih Persistence Unit. Berinama persistence unitnya, dan pilih Persistence Librarynya menjadi Eclipse Link (JPA2), JANGAN PILIH HIBERNATE, karena library hibernate yang ada di NetBeans 6.8 hanya mendukung JPA1 :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Pada bagian Database Connection, klik comboboxnya lalu pilih Create New Database Connection untuk membuat koneksi baru. Koneksi yang akan dibuat adalah koneksi ke database yang sebelumnya kita buat :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Setelah selesai, maka sekarang pada project akan ada file persistence.xml pada package META-INF. Artinya kita berhasil membuat Persistence Unit.

Membuat Entity

Berbeda jika menggunakan JDBC, sebuah tabel pada JPA bernama Entitas, jadi Entitas adalah sebuah Tabel. Dan itu merupakan class Java Beans, yaitu class yang hanya berisikan Getter dan Setter saja.

Perlu diingat bahwa sebuah class Entity harus memiliki Primary Key, jika class Entity tidak memiliki Primary Key, maka akan terjadi Error.

Untuk membuat sebuah class Entity caranya lewat menu File -> New File. Lalu pada bagian Categories pilih Persistence dan pada bagian File Types pilih Entity Class. Kali ini saya membuat sebuah entitas Mahasiswa dan untuk primary key-nya saya gunakan String :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Setelah itu buat propertynya beserta getter dan setternya, sehingga class Entity nya seperti terlihat pada code dibawah ini :

package khannedy.crudjpa;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Mahasiswa implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_mahasiswa")
    private String id;

    @Column(name = "nama_mahasiswa", length = 45)
    private String nama;

    @Column(name = "alamat_mahasiswa", length = 500)
    private String alamat;

    public String getAlamat() {
	return alamat;
    }

    public void setAlamat(String alamat) {
	this.alamat = alamat;
    }

    public String getNama() {
	return nama;
    }

    public void setNama(String nama) {
	this.nama = nama;
    }

    public String getId() {
	return id;
    }

    public void setId(String id) {
	this.id = 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 Mahasiswa)) {
	    return false;
	}
	Mahasiswa other = (Mahasiswa) 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 "khannedy.crudjpa.Mahasiswa[id=" + id + "]";
    }
}

Sebuah class entity harus ditandai dengan annotation @Entity, dan untuk primary key-nya ditandai dengan @Id. Sedangkan untuk @Column itu tandanya bahwa property itu adalah sebuah column di tabel database. namun defaultnya walaupun tidak ditandai dengan @Column, setiap property pasti dijadikan column di tabel database.

Membuat Persistence Utilities

Setelah membuat class Entity, sekarang saatnya kita buat class PersistenceUtilities, class ini digunakan untuk membuat EntityManagerFactory, hal ini agar kita dapat memanggil EntityManagerFactory di class manapun dan kapanpun kita mau. Untuk membuat class caranya pilih File -> New File. lalu pada bagian Categories pilih Java dan pada bagian File Types pilihΒ JavaΒ Class. Berinama class itu dengan nama PersistenceUtilities atau terserah anda, setelah itu buat kode seperti yang terlihat dibawah ini :

package khannedy.crudjpa;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class PersistenceUtilities {

    private final static EntityManagerFactory entityManagerFactory;

    static {
	// membuat EntityManagerFactory
	// parameter harus sama dengan nama Persistence Unit
	// yang ada pada file persistence.xml
	entityManagerFactory = Persistence.createEntityManagerFactory("crud-jpaPU");
    }

    public static EntityManagerFactory getEntityManagerFactory() {
	return entityManagerFactory;
    }
}

Untuk membuat EntityManagerFactory, kita bisa menggunakan class Persistence dan metode createEntityManagerFactory, tapi perlu diingat bahwa parameter yang digunakan adalah nama Persistence Unit yang sebelumnya telah dibuat pada file persistence.xml.

Membuat Tampilan Antarmuka

Sekarang saatnya membaut tampilan antarmuka menggunakan Java Swing. Untuk membuat Form di NetBeans sangat mudah karena NetBeans mendukung pembuatan Antarmuka secara Visual. Pilih File -> New File, lalu pada bagian Categories pilih Swing GUI Form dan pada bagian File Types pilih JFrame Form. Sekarang kita bisa membuat tampilan antarmuka aplikasi secara visual :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Mudah sekali untuk membuat tampilan antarmuka, kita hanya cukup melakukan DRAG dan DROP komponen yang ada di pallete ke form yang ada pada Editor. Saya anggap anda sudah mengerti bagaimana cara membaut tampilan antarmuka mengugnakan NetBeans. Jadi sekarang silahkan anda buat tampilan antarmuka seperti pada gambar dibawah ini :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Agar saat pengkodean tidak membingungkan, jadi sekarang kita samakan persepsi dulu πŸ˜€ . Silahkan ubah nama-nama komponen seperti pada gambar dibawah ini :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Sepertinya tidak perlu dijelaskan, karena gambar sudah bisa merepresentasikan komponen yang mana yang bernama seperti itu πŸ˜€

Membuat Table Model Mahasiswa

Karena kita menggunakan sebuah Tabel pada tampilan antarmukanya, jadi mau tidak kamu kita buat sebuah TableModel agar lebih memudahkan saat menambah data ke Tabel dan mengambil data dari Tabel. Untuk membuat TableModelMahasiswa, caranya seperti membuat kelas biasa, tidak ada yang berbeda.

package khannedy.crudjpa;

import java.util.List;
import javax.swing.table.AbstractTableModel;

public class TableModelMahasiswa extends AbstractTableModel {

    private List list;

    // mengubah seluruh data
    public void setData(List list) {
	this.list = list;
	// memberi peringatan ke tabel bahwa data berubah
	fireTableDataChanged();
    }

    // menambah data mahasiswa
    public void add(Mahasiswa mahasiswa) {
	list.add(mahasiswa);
	// memberi peringatan ke tabel bahwa data bertambah
	fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1);
    }

    // mengubah data mahasiswa
    public void edit(int index, Mahasiswa mahasiswa) {
	list.set(index, mahasiswa);
	// memberi peringatan ke tabel bahwa data berubah pada index ke-?
	fireTableRowsUpdated(index, index);
    }

    // menghapus data mahasiswa
    public void delete(int index) {
	list.remove(index);
	// memberi peringatan ke tabel bahwa data dihapus pada index ke-?
	fireTableRowsDeleted(index, index);
    }

    // mendapatkan mahasiswa pada baris ke-?
    public Mahasiswa get(int row) {
	return list.get(row);
    }

    // mendapatkan total baris
    public int getRowCount() {
	return list.size();
    }

    // mendapatkan total kolom
    public int getColumnCount() {
	return 3;
    }

    // mendapatkan nilai pada baris ke-? dan kolom ke-?
    public Object getValueAt(int rowIndex, int columnIndex) {
	switch (columnIndex) {
	    case 0:
		return list.get(rowIndex).getId();
	    case 1:
		return list.get(rowIndex).getNama();
	    case 2:
		return list.get(rowIndex).getAlamat();
	    default:
		return null;
	}
    }

    @Override
    // mendapatkan nama kolom pada index ke-?
    public String getColumnName(int column) {
	switch (column) {
	    case 0:
		return "Nim";
	    case 1:
		return "Nama";
	    case 2:
		return "Alamat";
	    default:
		return null;
	}
    }
}

Menambahkan Tabel Model ke Antarmuka

Setelah membuat TableModelMahasiswa jangan lupa untuk mengubah TableModel tabel Mahasiswa menjadi TableModelMahasiswa, caranya. Buka file Form yang tadi dibuat, setelah itu masuk ke bagian Source, lalu ubah konstruktornya yang sebelumnya seperti ini :

public class Form extends javax.swing.JFrame {

    /** Creates new form Form */
    public Form() {
        initComponents();
    }

menjadi seperti ini :

public class Form extends javax.swing.JFrame {

    private TableModelMahasiswa tableModelMahasiswa;

    /** Creates new form Form */
    public Form() {
	initComponents();

	tableModelMahasiswa = new TableModelMahasiswa();
	tabelMahasiswa.setModel(tableModelMahasiswa);
    }

Menambah Aksi Tombol

Sekarang saatnya menambahkan aksi-aksi untuk tombol TAMBAH, UBAH, SEGARKAN dan HAPUS. Untuk menambahkan aksi ke tombol caranya, klik kanan tombolnya lalu pilih Events -> Action -> actionPerformed. Setelah itu maka kita akan masuk ke kode. Untuk tombol tambah, berikan perintah seperti dibawah ini :

    private void tombolTambahActionPerformed(java.awt.event.ActionEvent evt) {
	// membuat entitymanager
	EntityManager manager = PersistenceUtilities.getEntityManagerFactory().createEntityManager();
	try {
	    // memulai transaksi
	    manager.getTransaction().begin();

	    // buat mahasiswa
	    Mahasiswa mahasiswa = new Mahasiswa();
	    mahasiswa.setId(textNIM.getText());
	    mahasiswa.setNama(textNama.getText());
	    mahasiswa.setAlamat(textAlamat.getText());

	    // bersihkan form
	    textNIM.setText("");
	    textNama.setText("");
	    textAlamat.setText("");

	    // simpah mahasiswa ke database
	    manager.persist(mahasiswa);
	    // tambahkan ke tabel
	    tableModelMahasiswa.add(mahasiswa);

	    // commit transaksi
	    manager.getTransaction().commit();
	} catch (Throwable t) {
	    // perlihatkan error
	    t.printStackTrace();
	    // rollback transaksi
	    manager.getTransaction().rollback();
	} finally {
	    // tutup entitymanager
	    manager.close();
	}
    }

Untuk tombol Ubah gunakan perintah seperti ini :

    private void tombolUbahActionPerformed(java.awt.event.ActionEvent evt) {

	// dapatkan baris tabel yang terseleksi
	int baris = tabelMahasiswa.getSelectedRow();

	// cek apakah baris tabel terseleksi
	if (baris < 0) {
	    // jika tidak maka batalkan aksi ubah
	    return;
	}

	// membuat entitymanager
	EntityManager manager = PersistenceUtilities.getEntityManagerFactory().createEntityManager();
	try {
	    // memulai transaksi
	    manager.getTransaction().begin();

	    // dapatkan mahasiswa dari tabel
	    Mahasiswa mahasiswa = tableModelMahasiswa.get(baris);

	    // ubah data mahasiswa
	    mahasiswa.setId(textNIM.getText());
	    mahasiswa.setNama(textNama.getText());
	    mahasiswa.setAlamat(textAlamat.getText());

	    // simpah perubahan mahasiswa ke database
	    manager.merge(mahasiswa);
	    // ubah mahasiswa di tabel
	    tableModelMahasiswa.edit(baris, mahasiswa);

	    // commit transaksi
	    manager.getTransaction().commit();
	} catch (Throwable t) {
	    // perlihatkan error
	    t.printStackTrace();
	    // rollback transaksi
	    manager.getTransaction().rollback();
	} finally {
	    // tutup entitymanager
	    manager.close();
	}
    }

Untuk tombol Hapus gunakan perintah seperti ini :

    private void tombolHapusActionPerformed(java.awt.event.ActionEvent evt) {
	// dapatkan baris tabel yang terseleksi
	int baris = tabelMahasiswa.getSelectedRow();

	// cek apakah baris tabel terseleksi
	if (baris < 0) {
	    // jika tidak maka batalkan aksi hapus
	    return;
	}

	// konfirmasi penghapusan
	if (JOptionPane.showConfirmDialog(this, "Anda Yakin Akan Menghapus Data Mahasiswa?", "Hapus Mahasiswa", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
	    // batalkan aksi hapus
	    return;
	}

	// membuat entitymanager
	EntityManager manager = PersistenceUtilities.getEntityManagerFactory().createEntityManager();
	try {
	    // memulai transaksi
	    manager.getTransaction().begin();

	    // dapatkan mahasiswa dari tabel
	    Mahasiswa mahasiswa = tableModelMahasiswa.get(baris);
	    // hapus data mahasiswa di database
	    manager.remove(manager.merge(mahasiswa));
	    // hapus data mahasiswa di tabel
	    tableModelMahasiswa.delete(baris);

	    // commit transaksi
	    manager.getTransaction().commit();
	} catch (Throwable t) {
	    // perlihatkan error
	    t.printStackTrace();
	    // rollback transaksi
	    manager.getTransaction().rollback();
	} finally {
	    // tutup entitymanager
	    manager.close();
	}
    }

Untuk tombol Segarkan gunakan perintah seperti ini :

    private void tombolSegarkanActionPerformed(java.awt.event.ActionEvent evt) {
	// membuat entitymanager
	EntityManager manager = PersistenceUtilities.getEntityManagerFactory().createEntityManager();
	try {
	    // muat seluruh data mahasiswa
	    List list = manager.createQuery("select a from Mahasiswa a order by a.id").getResultList();
	    // ubah seluruh data mahasiswa di tabel
	    tableModelMahasiswa.setData(list);
	} catch (Throwable t) {
	    // perlihatkan error
	    t.printStackTrace();
	} finally {
	    // tutup entitymanager
	    manager.close();
	}
    }

Selesai menambah Aksi πŸ˜€

Menambah Aksi Seleksi Pada Tabel

Agar lebih interaktif, saat user menseleksi satu buah baris ke Tabel, maka otomatis form akan menampilkan data yang ada ditabel. Tapi untuk menambahkannya jangan menggunakan aksi OnMouseClick, kenapa? Karena kadang mengubah baris tidak menggunakan mouse, bisa saja menggunakan tombol arrow di keyboard. Sehingga sekarang kita ubah lagi konstruktur Form menjadi :

public class Form extends javax.swing.JFrame {

    private TableModelMahasiswa tableModelMahasiswa;

    /** Creates new form Form */
    public Form() {
	initComponents();

	tableModelMahasiswa = new TableModelMahasiswa();
	tabelMahasiswa.setModel(tableModelMahasiswa);

	// tambahkan aksi seleksi baris
	tabelMahasiswa.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

	    public void valueChanged(ListSelectionEvent e) {
		// dapatkan baris yang terseleksi
		int baris = tabelMahasiswa.getSelectedRow();
		// cek apakah baris terseleksi
		if (baris != -1) {
		    // jika terseleksi, tampilkan data di form
		    // dapatkan mahasiswa dari tabel
		    Mahasiswa mahasiswa = tableModelMahasiswa.get(baris);
		    // tampilkan data di form
		    textNIM.setText(mahasiswa.getId());
		    textNama.setText(mahasiswa.getNama());
		    textAlamat.setText(mahasiswa.getAlamat());
		}
	    }
	});
    }

Memuat Data Mahasiswa

Saat pertama kali form muncul, sehingga kita ubah lagi isi konstruktornya menjadi seperti dibawah ini :

public class Form extends javax.swing.JFrame {

    private TableModelMahasiswa tableModelMahasiswa;

    /** Creates new form Form */
    public Form() {
	initComponents();

	tableModelMahasiswa = new TableModelMahasiswa();
	tabelMahasiswa.setModel(tableModelMahasiswa);

	// tambahkan aksi seleksi baris
	tabelMahasiswa.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

	    public void valueChanged(ListSelectionEvent e) {
		// dapatkan baris yang terseleksi
		int baris = tabelMahasiswa.getSelectedRow();
		// cek apakah baris terseleksi
		if (baris != -1) {
		    // jika terseleksi, tampilkan data di form
		    // dapatkan mahasiswa dari tabel
		    Mahasiswa mahasiswa = tableModelMahasiswa.get(baris);
		    // tampilkan data di form
		    textNIM.setText(mahasiswa.getId());
		    textNama.setText(mahasiswa.getNama());
		    textAlamat.setText(mahasiswa.getAlamat());
		}
	    }
	});

	// panggil aksi tombol segarkan
	tombolSegarkanActionPerformed(null);
    }

Lho kok cuma segitu? yup, tidak perlu kita buat ulang kodenya, tinggal kita panggil saja aksi tombol SEGARKAN, karena memang perintahnya sama, jadi gak perlu diketik ulang.

Ingat kata pepatah, “DON’T REPEAT YOUR CODE!

Tahap Akhir

Sekarang, Aplikasi Telah selesai, tinggal dijalankan lewat class Main, jadi sekarang kita ubah isi class Main agar menjalankan Form yang tadi kita buat :

package khannedy.crudjpa;

import javax.swing.SwingUtilities;

public class Main {

    public static void main(String[] args) {
	SwingUtilities.invokeLater(new Runnable() {

	    public void run() {
		Form form = new Form();
		form.setVisible(true);
	    }
	});
    }
}

Selesai, sekarang tinggal jalankan projectnya, caranya klik kanan projectnya lalu pilih Run, dan aplikasi akan berjalan πŸ˜€

Tapi Ups kok error :

run:
[EL Info]: 2010-03-25 23:10:04.617--ServerSession(21450309)--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
[EL Severe]: 2010-03-25 23:10:04.635--ServerSession(21450309)--Local Exception Stack:
Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:397)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at khannedy.crudjpa.Form.tombolSegarkanActionPerformed(Form.java:314)
        at khannedy.crudjpa.Form.(Form.java:54)
        at khannedy.crudjpa.Main$1.run(Main.java:12)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
Caused by: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at khannedy.crudjpa.Form.tombolSegarkanActionPerformed(Form.java:314)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at khannedy.crudjpa.Form.(Form.java:54)
        at khannedy.crudjpa.Main$1.run(Main.java:12)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        ... 14 more
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at khannedy.crudjpa.TableModelMahasiswa.getRowCount(TableModelMahasiswa.java:45)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

        at javax.swing.JTable.getRowCount(JTable.java:2630)
        at javax.swing.plaf.basic.BasicTableUI.createTableSize(BasicTableUI.java:1646)
        at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(BasicTableUI.java:1687)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1634)
        at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
        at java.awt.Container.layout(Container.java:1421)
        at java.awt.Container.doLayout(Container.java:1410)
        at java.awt.Container.validateTree(Container.java:1507)
        at java.awt.Container.validateTree(Container.java:1513)
        at java.awt.Container.validateTree(Container.java:1513)
        at java.awt.Container.validateTree(Container.java:1513)
        at java.awt.Container.validateTree(Container.java:1513)
        at java.awt.Container.validate(Container.java:1480)
        at java.awt.Window.dispatchEventImpl(Window.java:2476)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD STOPPED (total time: 12 seconds)

Haha, gak usah khawatir, itu karena Library MySQL Driver nya belum di includkan ke Project. Tinggal klik kanan bagian Libraries pada Project, lalu pilih Add Library, setelah itu pilih MySQL JDBC Driver :

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Sekarang coba jalankan ulang. Dan pasti BERHASIL πŸ˜€

Tampilan Aplikasi

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Membuat Aplikasi CRUD Menggunakan JPA2 dan NetBeans 6.8

Membuat Aplikasi CRUD Dengan JPA 2 dan NetBeans IDE 6.8

Download Source Code

Silahkan download sourcecodenya DISINI

Aplikasi Penjualan Sederhana, Menggunakan Java Swing dan Java Persistence API


Baru saja saya selesai membuat aplikasi penjualan sederhana menggunakan Java Swing dan Java Persistence API, aplikasinya sederhana, hanya menambahkan Barang, Kategori, Penjualan. dan belum sampai pembuatan laporan :D. Mungkin bisa teman-teman tambahkan sendiri πŸ˜€

Teknik pembuatan aplikasi ini adalah terinspirasi framework RubyOnRails, nanti di sourcecodenya teman-teman bisa melihat adanya Controller dan Helper, mirip di RubyOnRails, cuma bedanya ini gak pake ActiveRecord πŸ˜€ Soalnya menggunakan Java Persistence API, jadi ya gak perlu lagi bikin ActiveRecord πŸ˜€

Dibawah ini adalah screenshoot tampilannya :

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Aplikasi Penjualan 1.0

Aplikasi Penjualan Sederhana

Silahkan download sourcecodenya disini :

Referensi :

Pengenalan Data Access Object {6} Outro


ini adalah artikel penutup dari artikel tentang “PENGENALAN DATA ACCESS OBJECT”

dengan ini saya nyatakan bahwa anda sekarang sudah bisa mengimplementasikan konsep Data Access Object dalam program Java, tapi tidak tertutup kemungkinan juga bisa anda implementasikan konsep DAO ini pada bahasa pemrograman yang lain πŸ˜€

thank’s see you…