Spring boot Hibernate Basic 3 One To One Relation Part 2

 Pada artikel sebelumnya dijelaskan bagaimana melakukan one-to-one relationship dengan spesifiknya menggunakan JoinColumn. Selain cara itu, ada setidaknya 2 cara lagi yang pertama menggunakan shared primary key dan yang kedua menggunakan join table. Pada artikel kali ini akan menjelaskan bagaimana melakukan one-to-one relationship menggunakan shared primary key dan join table.

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

Mahasiswa.java


KartuMahasiswa.java

Service 

MahasiswaService.java

Repository 

MahasiswaRepository.java

@Repository
public interface MahasiswaRepository extends JpaRepository<Mahasiswa, BigDecimal>{
}


KartuMahasiswaRepository.java

@Repository
public interface KartuMahasiswaRepository extends JpaRepository<KartuMahasiswa, BigDecimal>{
}

Code Run

code yang dirunning terdapat test untuk membuat data :
1. Tanpa kartu
2. Dengan kartu
3. Dengan kartu kemudian hapus
4. Dengan kartu kemudian hapus kartunya saja

//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

Posting Komentar untuk "Spring boot Hibernate Basic 3 One To One Relation Part 2"