Shared Primary Key
Jika sebelumnya menggunakan @JoinColumn dan mappedBy sebagai penghubung antar 2 tabel. Apabila tabel kita mempunyai primary key dan ingin meletakkan sebagai foreign key, serta menjadi primary key pada tabel lain tersebut. Strategi @PrimaryKeyJoinColumn bisa digunakan, sehingga hanya ada 1 key yang digunakan bersama. Perhatikan ERD berikut.
ERD
ERD Mahasiswa dan Kartu_Mahasiswa |
Model
Service
Repository
@Repository
public interface MahasiswaRepository extends JpaRepository<Mahasiswa, BigDecimal>{
}
@Repository
public interface KartuMahasiswaRepository extends JpaRepository<KartuMahasiswa, BigDecimal>{
}
Code Run
//NO KARTU
Mahasiswa mahasiswa = new Mahasiswa();
mahasiswa.setNPM(new BigDecimal("1404511111"));
mahasiswa.setNama("John Bambang");
mahasiswa.setTanggalLahir(new Date(2003, 6, 20));
mahasiswa.setTempatLahir("Jakarta");
mahasiswaService.Store(mahasiswa);
//DENGAN KARTU
Mahasiswa acep = new Mahasiswa();
acep.setNPM(new BigDecimal("1404511112"));
acep.setNama("Acep Sumacep");
acep.setTanggalLahir(new Date(2003, 4, 21));
acep.setTempatLahir("Sumedang");
KartuMahasiswa kartuAcep = new KartuMahasiswa();
kartuAcep.setMasaBerlaku(new Date(2028, 6, 20));
kartuAcep.setStatus("AC");
kartuAcep.setMahasiswa(acep);
acep.setKartuMahasiswa(kartuAcep);
mahasiswaService.Store(acep);
//DENGAN KARTU KEMUDIAN HAPUS
Mahasiswa ajeng = new Mahasiswa();
ajeng.setNPM(new BigDecimal("1404511113"));
ajeng.setNama("Ajeng Jengajeng");
ajeng.setTanggalLahir(new Date(2001, 5, 23));
ajeng.setTempatLahir("Makassar");
KartuMahasiswa kartuAjeng = new KartuMahasiswa();
kartuAjeng.setMasaBerlaku(new Date(2028, 6, 20));
kartuAjeng.setStatus("AC");
kartuAjeng.setMahasiswa(ajeng);
ajeng.setKartuMahasiswa(kartuAjeng);
mahasiswaService.Store(ajeng);
mahasiswaService.destroy(ajeng);
//DENGAN KARTU KEMUDIAN HAPUS KARTU
Mahasiswa rosi = new Mahasiswa();
rosi.setNPM(new BigDecimal("1404511114"));
rosi.setNama("Valentina Rosi Oci");
rosi.setTanggalLahir(new Date(2001, 11, 23));
rosi.setTempatLahir("Jakarta");
KartuMahasiswa kartuRosi = new KartuMahasiswa();
kartuRosi.setMasaBerlaku(new Date(2028, 6, 20));
kartuRosi.setStatus("AC");
kartuRosi.setMahasiswa(rosi);
rosi.setKartuMahasiswa(kartuRosi);
mahasiswaService.Store(rosi);
mahasiswaService.removeKartuMahasiswa(rosi);
Hasil Code Run
hasil di databse H2 |
Join Table
Salah satu cara untuk menghubungkan one-to-one dengan menggunakan join table. Join table umumnya digunakan untuk relasi many-to-many. Menggunakan skema ini akan memaksakan hubungan antar 2 table akan selalu ada.
ERD
semisal kita mempunyai ERD antara nasabah dan kartu_debit, dimana selalu ada kartu_debit untuk setiap nasabah. Kita tidak ingin mengotori tiap tabel dengan foreign_key masing-masing tabel. Relasinya disimpan pada tabel yang bernama debit_nasabah.
ERD nasabah dan kartu_debit |
Model
Nasabah.java
KartuDebit.java
Jika melihat code untuk masing-masing class, Model untuk debit_nasabah tidak secara eksplisit didefinisikan dalam bentuk class .java. debit_nasabah didefinisikan pada Nasabah.java pada anotasi @JoinTable. Perlu diperhatikan juga bahwa terdapat 2 komponen tambahan yaitu joinColumns dan inverseJoinColumns yang masing-masing menyatakan foreign_key untuk tiap-tiap tabel.
Repository
NasabahRepository.java
@Repository
public interface NasabahRepository extends JpaRepository
}
KartuDebitRepository.java
@Repository
public interface KartuDebitRepository extends JpaRepository<KartuDebit, BigDecimal>{
}
Service
NasabahService.java
Code Run
Test hanya melakukan save saja karena kedua tabel harus saling berkoneksi dan tidak boleh null. Sehingga untuk test tanpa kartu debit tidak dilakukan. Jika kita memaksakan null maka akan terjadi error org.springframework.dao.InvalidDataAccessApiUsageException: Entity must not be null.
Nasabah nasabah = new Nasabah();
nasabah.setNoRekening(new BigDecimal(320976511));
nasabah.setNama("Rodrigues ALparam");
nasabah.setTempatLahir("Mexico City");
nasabah.setTanggalLahir(new Date(1980, 4, 24));
nasabah.setJenisNasabah("CORE");
KartuDebit kartuDebit = new KartuDebit();
kartuDebit.setNoKartu(new BigDecimal("11112221987"));
kartuDebit.setCCV(234);
kartuDebit.setJenis("VISA");
kartuDebit.setMasaBerlaku(new Date(2026, 6, 6));
kartuDebit.setNasabah(nasabah);
nasabah.setKartuDebit(kartuDebit);
nasabahService.store(nasabah);
Hasil Code Run
Hasil di database H2 untuk skema join table |
Untuk lebih lengkap secara code, bisa lihat pada github berikut.
Referensi
- https://www.baeldung.com/jpa-one-to-one diakses pada tanggal 8 Mei 2024
Posting Komentar untuk "Spring boot Hibernate Basic 3 One To One Relation Part 2"
Berilah komentar, saran, dan kritik dengan bijak