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 java.io.Serializable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import 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 javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

/**
 *
 * @author Deny Prasetyo
 */
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER, name="articleTypeId")
public abstract class Article extends ModelBase {

  private String articleId;
  private String title;
  private String summary;
  private String 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 javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Temporal;
import 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 static final long serialVersionUID = -6145145462382485655L;
    private String authorName;
    private String publisherName;
    private String 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;
    }
}

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 java.util.Calendar;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.jasoet.model.Article;
import org.jasoet.model.BookArticle;
import org.jasoet.model.MagazineArticle;

/**
 *
 * @author Deny Prasetyo
 */
public class MainClass {

    private EntityManager entityManager;
    private EntityManagerFactory entityManagerFactory;

    public MainClass() {
        entityManagerFactory = Persistence.createEntityManagerFactory("InheritanceJPAPU");
        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.

  1. kayaknya lagi ketagihan JPA nich 😀

    • e12x
    • Desember 4th, 2008

    mas jaseot nanya neh:
    sebenarnya apa maksud kode berikut:
    @DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER, name=”articleTypeId”)

    trus, pas nyoba jalanin kok muncul pesan kayak gini ya:

    Exception in thread “main” java.lang.IllegalArgumentException: Unknown entity: org.e12.model.BookArticle
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:223)
    at org.e12.model.testApp.doTest(testApp.java:40)
    at org.e12.model.testApp.main(testApp.java:73)

    padahal udah tak cek yang BookArticle dah gk da masalah :

    package org.e12.model;

    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;

    /**
    *
    * @author e12
    */
    @Entity
    @DiscriminatorValue(“2”)
    public class BookArticle extends Articel{
    private static final long serialVersionUID = 6145145462382485655L;
    private String authorName;
    private String publisherName;
    private String isbnNumber;

    public String getAuthorName() {
    return authorName;
    }

    public void setAuthorName(String authorName) {
    this.authorName = authorName;
    }

    public String getIsbnNumber() {
    return isbnNumber;
    }

    public void setIsbnNumber(String isbnNumber) {
    this.isbnNumber = isbnNumber;
    }

    public String getPublisherName() {
    return publisherName;
    }

    public void setPublisherName(String publisherName) {
    this.publisherName = publisherName;
    }
    }

  2. Diskriminator itu digunakan apabila kita ingin menggunakan konsep inheritance pada Entity Class di JPA.
    bisa baca di Java Doc disini
    http://java.sun.com/javaee/5/docs/api/javax/persistence/DiscriminatorColumn.html

    Nah kalau error yang disitu. Itu karena entity classnya belum didaftarkan d persistence.xml.

    Nah karena ketika persist alias save data Entity BookArticle tidak dikenali maka muncul IllegalArgumentException.

    Monggo di cek

  3. Oi … Deny lw tmn gw d fb….. wew… Share dong gw… klo persistence gw mw pakein MD5 gimana ya…????

    gw mw input data… bagian buat input pada persistence dimana???

  1. No trackbacks yet.

Tinggalkan komentar