Spring boot Hibernate Basic 2 One To One Relation


 ORM (Object Relational Model) menekankan bagaimana hubungan antar objek. Salah satu bentuk relational adalah One to One (1 to 1). Artikel kali ini akan membahas bagaimana One-to-One pada Hibernate dengan Spring Data JPA. Artikel ini kelanjutan dari artikel sebelumnya yaitu CRUD menggunakan H2.

One to One Relational 

 Hubungan One-to-One bisa diartikan sebagai satu baris data di suatu tabel(1) dihubungkan dengan satu baris dari tabel(2) lain. Contoh dunia nyatanya adalah data satu warga negara hanya punya satu data paspor yang aktif. Satu pegawai terhadap satu tempat kerja. dsbnya.

ERD One-to-One

 Berbicara one-to-one relationship, maka tidak akan jauh-jauh dari ERDnya. ERD (Entity Relationship Diagram) merupakan suatu diagram model yang menggambarkan hubungan antar entitas. Berikut contoh ERD untuk one-to-one relationship.

one-to-one warga_negara dengan paspor

one-to-one pegawai dengan meja_kerja

Code 

 One-to-one warga_negara dengan paspor akan diimplementasikan. Seperti pada artikel sebelumnya kita akan menggunakan Model untuk representasi tabel pada database. Kemudian kita memanfaatkan JPA Repository untuk membuat Repository dari kedua tabel tersebut. Lalu dibuat service WargaNegaraService untuk menghandle skema yang terkait kedua entity ini. 

Model 

Karena NIK ditaruh sebagai foreign key di tabel paspor kita bisa menggunakan skema join column.  Sehingga code untuk modelnya adalah sebagai berikut

WargaNegara.java


    Anotasi oneToOne (@OneToOne(mappedBy = "wargaNegara", cascade = CascadeType.ALL, orphanRemoval = true)) di Model WargaNegara menandakan bahwa paspor maksimal hanya memiliki 1 WargaNegara. Kemudian disambungkan dengan variabel wargaNegara pada class Paspor. CascadeType.All dan orphanRemoval = true, menandakan apabila row / object warga negara di hapus maka Paspor juga akan terhapus.

Paspor.java 


    Karena pada tabel Paspor terdapat kolom NIK yang merupakan foreign key dari tabel WargaNegara. Maka kita bisa menuliskan anotasi one-to-one (@OneToOne(cascade = CascadeType.All)) dilanjut dengan anotasi join kolom (@JoinColumn(name="NIK", referencedColumnName = "NIK")). pada anotasi joinColumn name melambangkan apa nama kolom pada tabel Paspor yang menyimpan foreign key dari tabel Warga Negara. Sedangkan, referencedColumnName melambangkan apa kolom pada WargaNegara yang disimpan nilainya pada tabel Paspor. Jadi semisal pada tabel WargaNegara.NIK diganti jadi WargaNegara.NIK_16 maka referenceColumnName menjadi NIK_16. Perhatikan gambar result dengan NIK_16.

Repository 

WargaNegaraRepository.java

 @Repository
public interface WargaNegaraRepository extends JpaRepository<WargaNegara, BigDecimal>{

}

PasporRepository.java 

 @Repository
public interface PasporRepository extends JpaRepository<Paspor, String>{

}

Service

WargaNegaraService.java 


Test Service  

WargaNegaraService wargaNegaraService = applicationContext.getBean(WargaNegaraService.class);
//NO PASPOR
WargaNegara noPaspor = new WargaNegara();
noPaspor.setNIK(new BigDecimal("342112222"));
noPaspor.setNamaKTP("Bamabang");
noPaspor.setTanggalLahir(new Date(1997, 6, 20));
noPaspor.setTempatLahir("RiverSide");
wargaNegaraService.Store(noPaspor);

//DENGAN PASPOR
WargaNegara pelancong = new WargaNegara();
pelancong.setNIK(new BigDecimal("314211222211"));
pelancong.setNamaKTP("Jasss Ha");
pelancong.setTanggalLahir(new Date(1997, 6, 20));
pelancong.setTempatLahir("RiverSide Water");

Paspor paspor = new Paspor();
paspor.setNoPaspor("SC111");
paspor.setMasaBerlaku(new Date(2028, 6, 20));
paspor.setStatus("AC");
paspor.setWargaNegara(pelancong);
pelancong.setPaspor(paspor);
wargaNegaraService.Store(pelancong);

//DENGAN PASPOR KEMUDIAN HAPUS
WargaNegara pindahNegara = new WargaNegara();
pindahNegara.setNIK(new BigDecimal("1113142112222"));
pindahNegara.setNamaKTP("Aezakmi Aaa");
pindahNegara.setTanggalLahir(new Date(1997, 6, 20));
pindahNegara.setTempatLahir("Winner Ciry");

Paspor pasporPindah = new Paspor();
pasporPindah.setNoPaspor("EXS0C111");
pasporPindah.setMasaBerlaku(new Date(2028, 6, 20));
pasporPindah.setStatus("AC");
pasporPindah.setWargaNegara(pindahNegara);
pindahNegara.setPaspor(pasporPindah);
wargaNegaraService.Store(pindahNegara);

wargaNegaraService.destroy(pindahNegara);

//DENGAN PASPOR KEMUDIAN HAPUS PASPOR SAJA
WargaNegara netizenBudiman = new WargaNegara();
netizenBudiman.setNIK(new BigDecimal("2221222222"));
netizenBudiman.setNamaKTP("Paling Benar");
netizenBudiman.setTanggalLahir(new Date(1997, 6, 20));
netizenBudiman.setTempatLahir("Rain Strom");

Paspor pasporHilang = new Paspor();
pasporHilang.setNoPaspor("HILANF1111");
pasporHilang.setMasaBerlaku(new Date(2028, 6, 20));
pasporHilang.setStatus("AC");
pasporHilang.setWargaNegara(netizenBudiman);
netizenBudiman.setPaspor(pasporHilang);
wargaNegaraService.Store(netizenBudiman);
wargaNegaraService.removePaspor(netizenBudiman);

 Service akan ditest menggunakan file utama Spring aplikasi (LearnHibernateApplication.java). Code artikel sebelumnya akan dikomen / dihilangkan, sehingga hanya runing dari baris WargaNegaraService wargaNegaraService = applicationContext.getBean(WargaNegaraService.class); sampai dengan wargaNegaraService.Store(pelancong);.  Terdapat 2 test yaitu save tanpa paspor dan dengan paspor. 

    Lalu dilanjut dengan melakukan penghapusan WargaNegara yang mempunyai Paspor (pindahNegara) dimana data  Paspor (pasporPindah) terhapus secara otomatis. Dilanjutkan dengan penghapusan paspor pasporHilang yang tanpa menghapus WargaNegara netizenBudiman.

Hasil secara databasenya adalah sebagai berikut:

 

hasil dengan NIK

hasil dengan NIK_16

Untuk lebih lengkap anda bisa melihat full di github berikut github.

Referensi

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