Skip to main content

Spring Data: Implementasi JPA dengan Hibernate pada Spring Boot

I - Kata Pembuka

Dalam dunia pengembangan aplikasi berbasis Java, pengelolaan data sering menjadi salah satu tantangan utama, terutama ketika berhadapan dengan basis data relasional. Menulis kode SQL yang berulang-ulang untuk setiap operasi seperti penyimpanan, pengambilan, pembaruan, dan penghapusan data tentu dapat memakan waktu dan berpotensi memunculkan kesalahan. Di sinilah Java Persistence API (JPA) dan Hibernate memainkan peran penting dalam menyederhanakan pengelolaan data.



II - Pengantar

Java Persistence API (JPA) adalah sebuah standar di dalam Java untuk mengelola data dalam basis data relasional dengan menggunakan pendekatan Object-Relational Mapping (ORM). Dengan ORM, kita dapat memetakan objek di dalam aplikasi Java ke tabel-tabel di basis data, sehingga pengembang tidak perlu lagi menulis SQL secara manual untuk setiap interaksi dengan basis data. JPA menyediakan antarmuka yang intuitif untuk operasi seperti penyimpanan, pengambilan, pembaruan, dan penghapusan data.

Di sisi lain, Hibernate adalah salah satu implementasi paling populer dari JPA. Sebagai framework ORM yang kuat dan fleksibel, Hibernate menyediakan fitur-fitur tambahan yang tidak hanya mematuhi spesifikasi JPA tetapi juga meningkatkan kinerjanya. Dengan Hibernate, pengembang dapat dengan mudah menangani berbagai kompleksitas dalam mengelola hubungan antar tabel, seperti relasi satu-ke-banyak atau banyak-ke-banyak, tanpa harus menulis kode SQL yang rumit.

Dalam blog post ini, kita akan membahas bagaimana JPA dan Hibernate bekerja bersama untuk memberikan solusi yang efisien dalam mengelola data di aplikasi Java. Mari kita mulai dengan memahami dasar-dasar kedua teknologi ini serta bagaimana implementasinya dalam proyek berbasis Spring Boot.


III - Memahami Hubungan antara Spring Data, JPA, dan Hibernate

Ketika membahas pengelolaan data dalam aplikasi Java modern, seringkali muncul tiga istilah yang saling berkaitan: Spring Data, JPA, dan Hibernate. Meskipun tampak serupa, ketiga teknologi ini memiliki peran dan fungsi yang berbeda, namun saling melengkapi. Mari kita jelaskan keterkaitan antara ketiganya agar pembaca lebih memahami konsep dasarnya.

1. Java Persistence API (JPA): Standar ORM di Java

JPA adalah sebuah spesifikasi (sekali ini baru spesifikasi saja bukan merupakan implementasi) atau standar di dalam Java yang mendefinisikan bagaimana data dari basis data relasional dapat diakses dan dikelola menggunakan Object-Relational Mapping (ORM). Dengan ORM, objek Java dapat dipetakan ke tabel di dalam basis data, sehingga interaksi dengan data (seperti penyimpanan, pembaruan, penghapusan, dan pengambilan data) dilakukan dengan cara memanipulasi objek, bukan SQL. JPA sendiri tidak menyediakan implementasi, melainkan sekadar antarmuka yang harus diimplementasikan oleh framework lain, seperti Hibernate.

JPA memberikan sejumlah anotasi seperti @Entity, @Id, @GeneratedValue, dan lain-lain untuk memudahkan pengembang memetakan kelas Java ke tabel basis data.

2. Hibernate: Implementasi dari JPA

Hibernate adalah salah satu implementasi JPA yang paling populer. Hibernate mengikuti spesifikasi JPA, tetapi juga menawarkan fitur tambahan yang lebih kaya dan canggih. Sebagai ORM framework, Hibernate tidak hanya memetakan objek Java ke tabel basis data, tetapi juga memberikan banyak fitur seperti caching, lazy loading, dan pengelolaan relasi yang lebih baik.

Meskipun JPA bisa digunakan tanpa Hibernate (karena ada implementasi lain seperti EclipseLink), Hibernate sering kali dipilih karena stabilitas dan komunitas pendukungnya yang besar.

Jadi, jika JPA adalah spesifikasi, maka Hibernate adalah salah satu implementasi spesifikasi tersebut yang diadopsi secara luas dalam komunitas pengembang Java.

3. Spring Data JPA: Abstraksi yang Memudahkan

Spring Data JPA adalah bagian dari Spring Data, yaitu sebuah modul yang dirancang untuk menyederhanakan pengembangan aplikasi berbasis data. Spring Data JPA adalah lapisan tambahan di atas JPA dan Hibernate yang menyediakan abstraksi lebih tinggi. Dengan menggunakan Spring Data JPA, pengembang tidak perlu menulis kode boilerplate yang biasanya diperlukan saat berinteraksi dengan JPA/Hibernate.

Spring Data JPA membuat pengelolaan repository (yakni tempat menyimpan logika CRUD seperti menyimpan, mengambil, memperbarui, dan menghapus data) menjadi lebih sederhana. Dengan hanya mendefinisikan antarmuka seperti JpaRepository, Spring Data JPA secara otomatis menyediakan implementasi CRUD dasar tanpa perlu menulis kode SQL atau query secara manual.

Hubungan dan Keterkaitannya

  • JPA adalah spesifikasi standar untuk ORM di Java.
  • Hibernate adalah salah satu implementasi JPA yang paling populer, mengikuti standar JPA, tetapi memberikan lebih banyak fitur.
  • Spring Data JPA adalah modul dari Spring yang membangun di atas JPA (serta menggunakan Hibernate sebagai implementasinya) untuk menyediakan cara yang lebih mudah dan efisien dalam mengelola data.

Dengan menggunakan Spring Data JPA, kita sebenarnya menggunakan Hibernate sebagai ORM di balik layar, tetapi tanpa perlu berurusan dengan banyak konfigurasi manual atau penulisan kode boilerplate. Jadi, Spring Data JPA menyederhanakan penggunaan Hibernate dan JPA dalam aplikasi Spring.

Penjelasan Masing Masing Workflow:

  • JPA mendefinisikan standar pemetaan objek ke tabel.
  • Hibernate mengimplementasikan standar tersebut dan menangani interaksi aktual dengan basis data.
  • Spring Data JPA menyediakan antarmuka sederhana (seperti JpaRepository) untuk memanfaatkan Hibernate tanpa perlu menulis kode CRUD manual.

Dengan demikian, pengembang dapat fokus pada logika bisnis tanpa harus terjebak dalam detail teknis pengelolaan data, karena Spring Data JPA sudah menyederhanakan banyak aspek dari JPA dan Hibernate.

Clone Existing Code Sebagai Base Project

Untuk memudahkan memulai bisa dengan memulai dengan menggunakan base project yang saya sebelumnya buat, secara sederhana ini hanya project Spring Boot kosong yang memiliki controller Rest APIs sederhana saja sebagai fiturnya.

Clone: https://github.com/yoesoff/YBoilerplate.git  Branch:  jpa-hibernate

Base project ini awalnya hanya memiliki dua endpoint saja (tanpa database suppot):  

1. REST Endpoint  
    Path: /rest/greeting
    HTTP Method: GET
    Controller: GreetingRestController
    Description: Returns a Greeting object with a message.

2. Web Endpoint
    Path: /greeting
    HTTP Method: GET
    Controller: GreetingController
    Description: Returns a view named greeting with a model attribute name

Segala penambahan code terkait MySQL, JPA dan Hibernate kemudian pada blog ini berada pada repository berikut ini.

Lokasi Repository di Github dan Branch yang digunakan.


IV - Implementasi SprinGg Data JPA dengan Hibernate di Spring Boot

Dari isi pom.xml di base project, belum ada dependensi untuk JPA atau Hibernate. Berikut adalah langkah-langkah untuk mengimplementasikan JPA dan Hibernate di dalam proyek Spring Boot Anda:

Langkah 1: Tambahkan Dependensi MySQL, JPA dan Hibernate

Untuk mengimplementasikan JPA dengan Hibernate, kita perlu menambahkan dua dependensi utama, yaitu spring-boot-starter-data-jpa (yang secara otomatis menyertakan Hibernate) dan driver basis data yang ingin Anda gunakan (misalnya MySQL, PostgreSQL, dll.).

Berikut adalah contoh dependensi yang perlu ditambahkan ke dalam <dependencies> di pom.xml Anda:

<!-- Spring Data JPA untuk Hibernate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Driver MySQL (sesuaikan jika Anda menggunakan database lain) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

Langkah 2: Konfigurasi application.properties atau application.yml

Setelah dependensi ditambahkan, langkah selanjutnya adalah mengonfigurasi pengaturan koneksi basis data di file application.properties atau application.yml. Contoh konfigurasi untuk MySQL:

Update  application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/yboilerplate
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

Jika menggunakan application.yml (bukan application.properties):

spring:
datasource:
url: jdbc:mysql://localhost:3306/yboilerplate
username: root
password: password
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect

"Dalam Spring Boot, baik application.yml maupun application.properties digunakan untuk mengkonfigurasi aplikasi. Namun, application.yml menawarkan fleksibilitas yang lebih besar dengan format YAML-nya yang mendukung struktur hierarkis dan berbagai tipe data. Ini membuatnya lebih mudah untuk mengelola konfigurasi yang kompleks." 

Nyalakan MySQL/MariaDB Server Database

"MySQL dan MariaDB memiliki tingkat kompatibilitas yang tinggi, termasuk dalam hal interface dan driver. Ini berarti Anda seringkali dapat menggunakan driver MySQL untuk terhubung ke database MariaDB dan sebaliknya tanpa perlu melakukan perubahan yang signifikan pada kode aplikasi Anda."

MariaDB container di Docker (Bisa juga di Install sperti biasa di HOST)

Posisi MariaDB Sudah running

Koneksi DBeaver dan MariaDB/MySQL

Buat Database bernama yboilerplate

Langkah 3: Buat Entity

Selanjutnya, Anda perlu membuat entitas yang akan dipetakan ke tabel di basis data. Gunakan anotasi JPA seperti @Entity, @Id, dan lainnya.

Contoh entity:

package com.mhyusuf.yboilerplate.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class User {

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

private String username;
private String password;

// Getter, Setter, Constructor, dll implemented by Lombok.

}

Penjelasan terkait anotasi-anotasi Lombok berikut memiliki fungsi sebagai berikut:  

  1. @Getter: Menghasilkan metode getter untuk semua field di kelas.
  2. @Setter: Menghasilkan metode setter untuk semua field di kelas.
  3. @NoArgsConstructor: Menghasilkan konstruktor tanpa argumen.
  4. @AllArgsConstructor: Menghasilkan konstruktor dengan argumen untuk semua field di kelas.
Penjelasan terkait notasi @Entity memiliki fungsi sebagai berikut:  

Anotasi @Entity dalam Java digunakan untuk menandai bahwa sebuah kelas adalah entitas dan dipetakan ke tabel dalam basis data. Anotasi ini merupakan bagian dari Java Persistence API (JPA). Ketika sebuah kelas diberi anotasi @Entity, ini menunjukkan bahwa kelas tersebut harus dipersistensikan ke basis data dan setiap instance dari kelas tersebut sesuai dengan satu baris dalam tabel.

Langkah 4: Buat Repository

Repository akan digunakan untuk melakukan operasi basis data (CRUD). Anda bisa membuat repository dengan meng-extend JpaRepository.

package com.mhyusuf.yboilerplate.repository;

import com.mhyusuf.yboilerplate.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
// Anda bisa menambahkan query tambahan di sini jika diperlukan
}

Dalam contoh ini, UserRepository akan memiliki semua metode yang disediakan oleh JpaRepository untuk mengelola entitas User.

Kegunaan dari UserRepository

  1. Tujuan: Bertindak sebagai repositori untuk entitas User.
  2. Fungsionalitas: Mewarisi semua operasi CRUD dan fungsionalitas JPA dari JpaRepository.
  3. Kustomisasi: Anda dapat menambahkan metode query kustom jika diperlukan.

Kegunaan dari JpaRepository
  1. Tujuan: Merupakan ekstensi spesifik JPA dari antarmuka Repository.
  2. Fungsionalitas: Menyediakan metode terkait JPA seperti flushing konteks persistensi dan menghapus catatan dalam batch.
  3. Metode Umum:
    1. save(S entity): Menyimpan entitas yang diberikan.
    2. findById(ID id): Mengambil entitas berdasarkan ID-nya.
    3. findAll(): Mengembalikan semua entitas.
    4. deleteById(ID id): Menghapus entitas dengan ID yang diberikan.
UserRepository dalam konteks Spring Data adalah antarmuka repositori yang memperluas JpaRepository. Antarmuka ini adalah bagian dari modul Spring Data JPA, yang menyediakan cara yang nyaman untuk berinteraksi dengan basis data menggunakan JPA (Java Persistence API).

Langkah 5: Gunakan Repository di Service atau Controller

Anda bisa menyuntikkan UserRepository ke dalam service atau controller untuk menggunakan fungsi CRUD.

package com.mhyusuf.yboilerplate.controller;

import com.mhyusuf.yboilerplate.entity.User;
import com.mhyusuf.yboilerplate.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
private UserRepository userRepository;

@GetMapping
public List<User> getAllUsers() {
return userRepository.findAll();
}

@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
}

Langkah 6: Jalankan Aplikasi

Reload Maven Project

Jangan lupa reload Maven project supaya dependency yang kita telah tambahkan diatas dapat terinstal dan dikenali dari dalam IDE.

Reload maven project untuk install dependency

Langkah 6: Jalankan Aplikasi / Rerun Project

Setelah semua langkah di atas selesai, Anda bisa menjalankan aplikasi Spring Boot Anda, dan JPA dengan Hibernate akan secara otomatis terhubung dengan basis data Anda untuk melakukan operasi CRUD.

Jika ada error, pastikan bahwa pengaturan basis data di application.properties atau application.yml sudah benar, dan basis data Anda aktif.



Langkah 7: Cek Endpoint Di Browser

Pesan error menjelaskan bahwa Hibernate atau JPA mencoba menjalankan query SQL untuk mengambil data dari tabel user, tetapi tabel tersebut tidak ada di basis data. Ini adalah kesalahan umum ketika Hibernate/JPA tidak dapat menemukan atau memetakan entitas Java dengan tabel yang sesuai di basis data.

Error karena table users belum ditemukan.


Cek Pengaturan Hibernate Auto DDL (Data Definition Language)

Jika Anda ingin Hibernate secara otomatis membuat tabel di basis data, pastikan konfigurasi spring.jpa.hibernate.ddl-auto disetel dengan benar di application.properties atau application.yml.

Untuk pembuatan otomatis tabel, Anda dapat menggunakan:

spring.jpa.hibernate.ddl-auto=create

Nilai lain yang dapat Anda gunakan untuk ddl-auto adalah:

  • create: Membuat tabel dari awal setiap kali aplikasi dijalankan.
  • update: Memperbarui skema tabel tanpa menghapus data.
  • create-drop: Membuat tabel saat aplikasi berjalan dan menghapusnya saat aplikasi berhenti.
  • validate: Memeriksa apakah skema sudah sesuai dengan entitas tanpa mengubahnya.
Setelah applikasi di rerun maka akan ada tabe user yang dubutuhkan.
 
Table user di databae setelah ddl-auto=create dan server di re run

Tampilan di Browser
Postman POST Request untuk insert data baru

Data yang baru saja di tambahkan via Postman



Penutup

Dengan memahami perbedaan dan hubungan antara Spring Data, JPA, dan Hibernate, diharapkan pembaca tidak bingung tentang peran masing-masing teknologi tersebut serta bagaimana ketiganya bekerja sama untuk menyediakan solusi pengelolaan data yang efisien di aplikasi Java.


Clone: https://github.com/yoesoff/YBoilerplate.git  Branch:  jpa-hibernate


Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....