terkadang didalam struktur sebuah tabel, tidak hanya memiliki 1 primary key tetapi juga bisa lebih dari 2 primary key itu dinamakan Composite Primary Key. apakah hibernate bisa handle composite primary key???

tentu aja bisa, ada 2 cara yaitu:

  1. @EmbeddedId
  2. @IdClass

Yang pertama kita bahas menggunakan EmbeddedId

Embeddable

Untuk EmbeddedId mapping, pertama kita define dulu primary keynya di class Embeddable yang wajib implement serializable seperti berikut:

Dan kita buat entitynya seperti berikut:

Setelah itu kita buat DAO:

Dan berikut adalah Unit Testingnya:

Jika dijalankan maka hasilnya seperti berikut:

Jan 04, 2021 7:20:05 AM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: 
    insert 
    into
        kampus.kelas_embedded
        (description, kelas_name, prodi, class_id, tahun_angkatan) 
    values
        (?, ?, ?, ?, ?)
[main] INFO com.maryanto.dimas.bootcamp.test.kampus.TestSaveClassRoomEmbedded - classroom saved: ClassRoomEmbeddedMapping(pk=KeyClassRoomEmbeddedId(year=2011, classId=si-ii), name=SI - II, programStudy=IF, description=System Informasi - II)
[main] INFO com.maryanto.dimas.bootcamp.test.kampus.TestSaveClassRoomEmbedded - destroy hibernate session!

IdClass

Untuk IdClass Mapping, sama seperti embedded kita define dulu class primary key yang wajib implement serializable seperti beriku:

Setelah itu baru kita buat entity dengan multiple @Id dan @IdClass(KeyClassRoomIdClass.class) seperti berikut:

Nah abis itu baru buat DAO:

Dan yang berikutnya adalah Unit Testing:

Jika dijalankan maka hasilnya seperti berikut:

Jan 04, 2021 7:30:21 AM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: 
    insert 
    into
        kampus.kelas_idclass
        (description, kelas_name, prodi, class_id, tahun_angkatan) 
    values
        (?, ?, ?, ?, ?)
[main] INFO com.maryanto.dimas.bootcamp.test.kampus.TestSaveClassRoomIdClass - classroom saved: ClassRoomMappingIdClass(year=2011, classId=si-01, name=SI - II, programStudy=IF, description=System Informasi - II)
[main] INFO com.maryanto.dimas.bootcamp.test.kampus.TestSaveClassRoomIdClass - destroy hibernate session!

Dan untuk Unit Test find by id:

Jika dijalankan maka hasilnya seperti berikut:

Jan 04, 2021 7:32:46 AM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: 
    select
        classroomm0_.class_id as class_id1_2_0_,
        classroomm0_.tahun_angkatan as tahun_an2_2_0_,
        classroomm0_.description as descript3_2_0_,
        classroomm0_.kelas_name as kelas_na4_2_0_,
        classroomm0_.prodi as prodi5_2_0_ 
    from
        kampus.kelas_idclass classroomm0_ 
    where
        classroomm0_.class_id=? 
        and classroomm0_.tahun_angkatan=?
[main] INFO com.maryanto.dimas.bootcamp.test.kampus.TestFindByIdClassRoomIdClass - classroom: ClassRoomMappingIdClass(year=2011, classId=si-01, name=SI - II, programStudy=IF, description=System Informasi - II)
[main] INFO com.maryanto.dimas.bootcamp.test.kampus.TestFindByIdClassRoomIdClass - destroy hibernate session!