Membuat Implementasi Auditable Untuk Spring Data Auditing


Pada tulisan Memakai Fitur Auditing di Spring Data JPA, saya memakai AbstractAuditable agar cepat.  Tapi kadang-kadang apa yang disediakan oleh AbstractAuditable berbeda dengan keinginan saya.  Sebagai contoh, AbstractAuditable diturunkan dari AbstractPersistable yang mendefinisikan id dengan @GeneratedValue(strategy=GenerationType.AUTO).  Bagaimana jika saya ingin strategi yang berbeda?  Atau, bagaimana bila saya tidak ingin menyimpan createdDate?

Saya wajib mengimplementasikan interface Auditable pada setiap domain class yang ada.  Tapi daripada membuat implementasi di seluruh domain class yang ada (terjadi duplikasi), saya sebaiknya meletakkan implementasi disebuah abstract class, yang saya beri nama AuditableDomain.  Isi dari class ini saya copy-paste dari isi class AbstractAuditable beserta AbstractPersistable, yaitu:

import java.io.Serializable;
import java.util.Date;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.joda.time.DateTime;
import org.springframework.data.domain.Auditable;

@MappedSuperclass
public abstract class AuditableDomain<U,PK extends Serializable> implements Auditable<U, PK>{

    private static final long serialVersionUID = -5057318377914867780L;

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

    @ManyToOne
    private U createdBy;

    @ManyToOne
    private U lastModifiedBy;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    public U getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(final U createdBy) {
        this.createdBy = createdBy;
    }

    public DateTime getCreatedDate() {
        return null
    }

    public void setCreatedDate(final DateTime createdDate) {
                // tidak melakukan apa-apa
    }

    public U getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(final U lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public DateTime getLastModifiedDate() {
        return null == lastModifiedDate ? null : new DateTime(lastModifiedDate);
    }

    public void setLastModifiedDate(final DateTime lastModifiedDate) {
        this.lastModifiedDate = null == lastModifiedDate ? null : lastModifiedDate.toDate();
    }

    public PK getId() {
        return id;
    }

    protected void setId(final PK id) {
        this.id = id;
    }

    public boolean isNew() {
        return null == getId();
    }
}

Perbedaannya dengan class AbstractAuditable adalah pada class AuditableDomain, saya bisa mengubah annotation yang  dipakai sesuka hati saya, misalnya saya memakai strategi GenerationType.IDENTITY dalam menghasilkan id untuk domain class yang ada.   Selain itu, saya juga menghilangkan atribut createdDate karena domain class saya sudah punya atribut tanggal.

Saya memastikan bahwa class AuditableDomain memiliki annotation @MappedSuperclass sehingga Hibernate JPA akan memproses annotation di class ini bila seandainya class lain diturunkan dari class ini.   Sekarang, saya tinggal menurunkan semua domain class saya dari class AuditableDomain seperti yang terlihat dari kode program berikut ini:

@Entity
@Table(name="tblPemesanan")
public class Pemesanan extends AuditableDomain<User, Long> implements Serializable {
  ...
}

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: