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
- http://heryadi-grafis.blogspot.com/2017/03/relasi-one-to-one-one-to-many-many-to.html diakses pada tanggal 01-Mei-2024
- https://www.baeldung.com/jpa-one-to-one diakses pada tanggal 01-Mei-2024
- http://www.sinaungoding.com/relasi-one-to-one-hibernate-anotasi/ diakses pada tanggal 01-Mei-2024
Posting Komentar untuk "Spring boot Hibernate Basic 2 One To One Relation"
Berilah komentar, saran, dan kritik dengan bijak