Coding Best Practice : Berbagi Masalah dan Solusi buat Coder [3] โ€“ Database Migration


Database Migration

Database Migration

kerja bareng temen, trus dapat update code baru dari temen, pas di-running, eh error TABLE NOT FOUND, *tonjoktemennya* gara2 gak bilang2 bikin table baru

ini biasa terjadi kalo bikin project bareng2 lebih dari satu orang, kalo komunikasinya gak bagus, bisa miss informasi, dan developer lain bisa kena masalah kayak ini

solusinya gimana?ย  Baca lebih lanjut

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 ๐Ÿ˜€

kapan perlu pake JDBC dan kapan pake ORM (hibernate, jpa)?


#TanyaJava

kapan perlu pake JDBC dan kapan pake ORM (hibernate, jpa)?

jawabannya sih relatif, suka2 yang coding. tapi pasti ada alasan dibalik coder pilih pake jdbc atau orm seperti hibernate atau jpa.

kapan perlu pake jdbc? saat memang kita sangat ketergantungan sama fasilitas database, contohnya, store procedure, trigger, dan fungsi2 bawaan databasenya. hal ini akan sangat sulit dilakukan diย orm. pake jdbc juga dengan ketentuan, sampai kapanpun gak akan pernah ganti database, karena kalo sampai ganti, berarti harus rewrite ulang seluruh perintah sql nya.

kapan perlu pake orm? saat memang kita gak terlalu butuh fitur2 bawaan database, orm saat ini hanya bisa perintah sql standar (insert, update, delete, select, create table), untuk membuat trigger, function dan store procedure, belum bisa, walaupun ada beberapa orm yang mampu, hanya memanggil store procedure saja. salah satu kelebihan orm, kita mudah ganti2 database, karena memang seluruh perintah sql nya di lakukan oleh orm.

tapi orm itu lambat? selambat2nya bukan berarti operasi jdbc itu 1 detik, orm itu 1 menitย ย perbedaan kecepatan paling hanya beberapa milisecond, dan itu seperti kedipan mata, jadi gak berpengaruh jugaย ย apalagi semakin kesini hardware semakin canggih, jadi kecepatan milisecond benar2 gak kan kerasa.

sekian, follow juga twitter kita di @PakarJava

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 ๐Ÿ˜€

Contoh Project CRUD Menggunakan NetBeans Platform dan Java Persistence API 2


NetBeans Platform 6.9

NetBeans Platform 6.9

Peralatan yang diperlukan :

  1. Java Development Kit 1.6
  2. NetBeans Platform 6.9
  3. MySQL Database Server 5.1

Iseng-iseng, bikin project Crud menggunakan NetBeans Platform dan Java Persistence API 2, lumayan buat belajar lah ๐Ÿ˜€ Crud nya juga gak terlalu simple, lumayan agak rumit (artinya banyak simplenya ๐Ÿ˜€ ), ada 2 tabel, user dan group, dan satu user punya satu group, tapi satu group bisa punya kosong atau lebih dari satu group ๐Ÿ˜€

Ini screenshootnya ๐Ÿ˜€

Crud Persistence

Crud Persistence

Baca lebih lanjut

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 Laporan yang Multi-Database dan Multi-Persistence Menggunakan JasperReport


Sudah tau tentang JasperReport kan?

Jika belum itu tandanya anda kurang pergaulan ๐Ÿ™‚ , sudah pasti setiap developer Java mengetahui tentang JasperReport, khususnya yang bercimpung di dunia Sistem Informasi. Kenapa? Karena dimana ada Sistem Informasi, disitu pula pasti ada yang namanya Laporan, yup bagi yang belum tau, JasperReport adalah framework untuk membuat laporan di Java.

Saat ini kebanyakan orang menggunakan SQL dan teman-temannya dalam membuat laporan, kenapa? Karena memang mudah ๐Ÿ˜€

Tapi tahukan Anda kalo banyak sekali perbedaan perintah SQL setiap Sistem Basis Data? Misal di MySQL memiliki perintah LIMIT untuk membatasi banyak record yang ditemukan, sedangkan di ORACLE tidak ada perintah LIMIT ๐Ÿ˜ฆ

Hal ini bisa berakibat kita perlu membuat ulang laporan yang sudah dibuat jika kita akan melakukan migrasi dari satu Sistem Basis Data ke Sistem Basis Data yang lainnya ๐Ÿ˜ฆ #capedeh

Tapi tenang saja, setelah membaca tutorial ini Anda tidak perlu khawatir lagi soal gonta-ganti SQL di laporan yang anda buat ๐Ÿ˜€ 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 <–