Spring boot Hibernate Basic 5 One To Many

 


    Setelah pada artikel sebelumnya dibahas tentang one-to-one relationship. Artikel kali ini akan membahas tentang one-to-many relationship menggunakan JPA dan spring boot. Untuk konfigurasi project anda bisa membacanya di Spring boot Hibernate Basic 1 CRUD Menggunakan database H2.

ERD

contoh yang akan digunakan adalah antara Provinsi dan Kabupaten. 1 Provinsi terdiri dari banyak kabupaten,  1 kabupaten hanya memiliki satu Provinsi. 



Model / Entitas

Dari ERD akan dibuat modelnya pada package wilayah. File yang akan dibuat adalah Provinsi.java dan Kabupaten.java

Provinsi.java

 
@Entity
@Data
public class Provinsi {
    @Id
    @Column(name = "CODE_PROVINSI")
    private String codeProvinsi;
    
    @Column(name = "NAMA")
    private String nama;
    
    @OneToMany(mappedBy = "provinsi", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Kabupaten> kabupatens = new ArrayList<Kabupaten>();
} 

Pada Provinsi.java object kabupatens menampung list kabupaten-kabupaten apa saja yang dimiliki oleh Provinsi ini. Dengan penjelasan anotasinya adalah sebagai berikut : 

  • @OneToMany: Menandakan bahwa hubungan ini adalah relasi satu ke banyak (One-to-Many). Provinsi sebagai onenya dan kabupaten sebagai manynya.
  • mappedBy = "provinsi" : Menentukan nama atribut di entitas tujuan yang mengelola hubungan / relation ini (Kabupaten). properti ini menunjukkan bahwa entitas (Provinsi) ini tidak memiliki kolom relasi pada tabelnya, tetapi entitas lainlah (Kabupaten) yang memiliki / mengelolanya. Menandakan juga bahwa nama variabel yang mengelola adalah "provinsi".
  • cascade = CascadeType.ALL: Menyatakan bahwa semua operasi (persist, merge, remove, refresh, detach) yang dilakukan pada entitas induk juga akan dilakukan pada entitas anak (Kabupaten).
  • orphanRemoval = true: Mengatur bahwa entitas anak (Kabupaten) yang tidak lagi terhubung ke entitas induk (Provinsi) akan dihapus dari database.

Kabupaten.java

@Entity
@Data
public class Kabupaten {
    @Id
    private String codeKabupaten;
    
    private String nama;
    
    @ManyToOne()
    @JoinColumn(name = "codeProvinsi")
    private Provinsi provinsi;
} 

Pada class Kabupaten, variabel provinsi digunakan sebagai penghubung dengan keterangan anotasinya sebagai berikut:

  • @ManyToOne: Menandakan bahwa hubungan ini adalah relasi banyak ke satu (Many-to-One), artinya banyak entitas Kabupaten dapat merujuk ke satu entitas Provinsi.
  • @JoinColumn(name = "codeProvinsi"): Menentukan kolom dalam tabel Kabupaten yang akan menyimpan referensi ke entitas Provinsi. Nama kolom ini adalah codeProvinsi yang akan otomatis diterjemahkan menjadi kolom code_provinsi pada tabel Kabupaten.

Repository

JPARepository digunakan untuk melakukan pengelolaan entitas dari model Provinsi dan Kabupaten.

ProvinsiRepository.java

@Repository
public interface ProvinsiRepository extends JpaRepository<Provinsi, String>{

} 

KabupatenRepository.java

@Repository
public interface KabupatenRepository extends JpaRepository<Kabupaten, String>{

} 

Service

Karena dalam package wilayah, digunakan WilayahService untuk melakukan akses ke repository dan model dari Provinsi dan Kabupaten. Buat satu fungsi yaitu saveProvinsi untuk melakukan penyimpanan ke database.

WilayahService.java
 
@Service
public class WilayahService {
    @Autowired
    private KabupatenRepository kabupatenRepository;
    
    @Autowired
    private ProvinsiRepository provinsiRepository;
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveProvinsi(Provinsi provinsi) {
        provinsiRepository.save(provinsi);
    }
} 

Test Run

untuk melakukan test akan dibuat method runProvinsi pada file utama project (LearnHibernateApplication.java)

Test Code

 
@SpringBootApplication
public class LearnHibernateApplication {

    
    public static void main(String[] args) throws Exception {
        ApplicationContext applicationContext =    SpringApplication.run(LearnHibernateApplication.class, args);
        //...        
        WilayahService wilayahService = applicationContext.getBean(WilayahService.class);
        runProvinsi(wilayahService);
    }
    // ...
    public static void runProvinsi(WilayahService wilayahService) {
        Provinsi jabar = new Provinsi();
        jabar.setCodeProvinsi("32");
        jabar.setNama("Jawa Barat");
        
        Kabupaten cirebon = new Kabupaten();
        cirebon.setCodeKabupaten("3209");
        cirebon.setNama("Kabupaten Cirebon");
        cirebon.setProvinsi(jabar);
        jabar.getKabupatens().add(cirebon);
        
        Kabupaten bogor = new Kabupaten();
        bogor.setCodeKabupaten("3201");
        bogor.setNama("Kabupaten Bogor");
        bogor.setProvinsi(jabar);
        jabar.getKabupatens().add(bogor);
        
        wilayahService.saveProvinsi(jabar);
    }
} 

Hasil



Source code pada github anda bisa lihat disini github - wilayah package.

Referensi 

Posting Komentar untuk "Spring boot Hibernate Basic 5 One To Many "