author-pic

Ferry S

An ISTJ, Type 5, Engineer, Gamer, and Thriller-Movies-Lover
Mengenali Konsep Operasi pada JPA & Hibernate
Fri. Mar 22nd, 2024 08:12 PM3 mins read
Mengenali Konsep Operasi pada JPA & Hibernate
Source: Bing Image Creator - thumbnail image of the Java Persistence API (JPA)

Pada JPA terdapat beberapa konsep dan operasi penting yang wajib diketahui sebelum menggunakan JPA. Sebelum mengenal beberapa konsepnya, kita harus pahami dulu bahwa JPA itu adalah interface untuk mengelola operasi data relational pada Java. Implementasi JPA yang paling terkenal adalah Hibernate. Pada Hibernate terdapat first level cache pada Persistence Context untuk menampung semua data objek entity yang dieksekusi sebelum dikirim ke database yang berlaku untuk satu sesi yang sama. Jadi setiap kita eksekusi data menggunakan JPA, data itu belum tentu langsung dikirim ke database, melainkan ditampung dulu di Persistence Context. Data tersebut akan dikirim ke database hanya bila dirasa perlu oleh Hibernate atau dikirim manual. Cache tersebut mempercepat performa karena bila kita melakukan query untuk data yang pernah kita gunakan maka datanya akan diambil dari Persistence Context, kalau ga ada baru datanya dicari ke database. Selain itu juga ada opsi second level cache, yaitu cache yang berlaku untuk semua sesi di aplikasi. Tapi by default ini ga aktif kecuali diaktifkan by config karena dapat membuat data inkonsisten jika sering terjadi perubahan di database. Sekarang kita lanjut ke beberapa konsep dari JPA:

Transient adalah state di saat sebuah objek entity baru dibuat dan belum terasosiasi apapun ke JPA atau database. Ini posisinya ketika kita bikin objek baru & sebatas melakukan set value pada objek, tapi belum mengeksekusi operasi JPA apapun. Entity tersebut belum dikelola pada Persistence Context.

Persistent adalah state di saat sebuah entity telah terasosiasi dengan JPA & database melalui Hibernate kemudian dikelola di Persistence Context. Pada EntityManager kita bisa menggunakan method persist() untuk melakukannya. Method tersebut akan mengeksekusi command insert jika state sebelumnya Transient, atau tidak mengeksekusi command apapun bila sudah Persistent. Jika sudah Persistent dan kita melakukan perubahan value pada objek tersebut, maka saat commit JPA akan mengeksekusi command update tanpa kita eksekusi manual. Setiap pemanggilan query terkait data entity yang sudah dikelola di Persistence Context, maka data yang diambil umumnya berasal dari Persistence Context, bukan dari database langsung. Kecuali pada kondisi tertentu yang mengharuskan JPA untuk memanggil langsung ke database seperti saat setelah detach.

Detached adalah state di saat sebuah entity yang tadinya terasosiasi dengan database dan dikelola Persistence Context menjadi tidak terasosiasi lagi dengan database dan dihapus dari Persistence Context. Jadi setiap perubahan value pada entity yang sudah Detached saat di-commit tidak akan tersimpan ke database. Pada EntityManager kita bisa menggunakan method detach() untuk melakukannya. Ini biasanya dilakukan bila ingin mengelola entity tanpa berhubungan dengan JPA atau database lagi. Saat kita melakukan query lagi terhadap entity tersebut, maka data yang akan ditampilkan adalah data dari objek baru yang diambil dari database, bukan data entity yang sudah Detached tadi. Jika entity baru itu disimpan, maka data tersebut akan disimpan sebagai objek baru pada Persistence Context. Entity yang sudah Detached tidak bisa menjadi Persistent lagi. Tapi value dari objek tersebut masih bisa dijadikan Persistent melalui Merge sebagai objek baru. Selain dari Merge, entity yang sudah Detached tidak bisa digunakan lagi untuk operasi apapun.

Clear ini maksudnya adalah melakukan Detached pada semua entity yang dikelola dan terasosiasi dengan Persistence Context. Pada EntityManager kita bisa menggunakan method clear().

Merge adalah menggabungkan value entity objek yang sudah Detached atau masih Transient dengan value entity objek yang tersimpan. Ini biasanya dilakukan ketika kita melakukan update data. Hibernate akan mengambil data dari Persistence Context atau database jika belum ada, lalu melakukan update dengan value objek entity yang akan di-merge dan menyimpannya pada Persistence Context. Jika di database datanya juga ga ada, maka akan dilakukan insert. Operasi ini adalah operasi default saat melakukan update data bila kita menggunakan Spring Data Jpa. Pada EntityManager kita bisa menggunakan method merge().

Sesuai namanya, Remove artinya menghapus data entity objek pada Persistence Context dan database. Sederhananya, ini akan mengeksekusi command delete pada database. Pada EntityManager kita bisa menggunakan method remove().

Seperti pada penjelasan di awal, setiap dieksekusi belum tentu data entity tersebut langsung dikirim ke database, melainkan di-cache dulu pada Persistence Context. Datanya hanya akan dikirim jika dirasa perlu. Tapi untuk beberapa kasus kita ingin mengirimnya ke database langsung secara manual tanpa harus menunggu. Misalnya saat kita ingin mengeksekusi trigger yang ada pada database saat update. Mengirim data dari Persistence Context ke database secara manual inilah yang disebut dengan Flush. Ketika melakukan Flush semua perubahan yang masih pending di Persistence Context akan terkirim ke database. Pada EntityManager kita bisa menggunakan method flush(). Oh ya, terkirim ini maksudnya bukan berarti langsung commit jadi data permanen, melainkan diproses di memori database. Data tersebut hanya akan tersimpan permanen kalau udah commit.

Refresh artinya melakukan sinkronisasi kembali value pada entity objek dengan value yang terdapat pada database. Misalkan kita punya data Person dengan name = “ferry” pada database, lalu pada entity kita mengubah name = “sikumbang”. Saat kita melakukan Refresh terhadap objek entity tersebut, maka value entity tadi akan disesuaikan kembali dengan value name yang terdapat pada database menjadi “ferry”. Perubahan menjadi name = “sikumbang” akan tergantikan oleh value name dari database. Pada EntityManager kita bisa menggunakan method refresh().

Lock ini fungsinya adalah mengunci sebuah objek entity agar entity tersebut tidak bisa diubah value-nya oleh transaksi lain hingga transaksinya commit atau dibatalkan. Ini diperlukan untuk menghindari konflik saat melakukan perubahan data. Lock ini juga udah pernah gw bahas konsepnya di tulisan tentang Locking. Bagi yang belum baca boleh dibaca dulu🙂.

Itulah beberapa istilah di JPA/Hibernate yang wajib dipahami saat mengelola data relasional menggunakan Java. Dengan mengenali konsep-konsep tersebut, kita dapat mengelola operasi pada JPA dengan baik dan melakukan optimasi.