Mengenal Identifier Framework Hibernate(Bagian 2)
Bismillah,
Pada postingan sebelumnya sudah dibahas mengenai identifier sederhana dengan sebuah kolom sebagai identifier, sementara masih ada lagi identifier yang lebih komplek lagi dengan kolom lebih dari satu. Identifier seperti ini sering disebut composite identifier. Biasanya model identifier jenis ini akan entitasnya berelasi dengan entitas yang lain, beberapa point yang akan dibahas adalah sebagai berikut
- Composite identifier menggunakan
<a href="#Composite-identifier-menggunakan-@EmbeddedId">@EmbeddedId</a>
- Composite identifier menggunakan
<a href="#Composite-identifier-menggunakan-@IdClass">@IdClass</a>
- Composite identifier dengan asosiasi
- Composite identifier dengan generated properties
- References
Composite identifier menggunakan @EmbeddedId
{#Composite-identifier-menggunakan-@EmbeddedId}
@EmbeddedId
digunakan untuk menjadikan lebih dari satu identifier dalam sebuah entitas, untuk lebih jelasnya dapat dicontohkan seperti pada potongan program di bawah ini
@Embeddable
public class MahasiswaPK implements Serializable {
private String nim;
private String no_telf;
public MahasiswaPK() {
}
public MahasiswaPK(String nim, String no_telf) {
this.nim = nim;
this.no_telf = no_telf;
}
//Getter dan setter silakan generate menggunakan IDE
Entitas MahasiswaPK
berisi field-field untuk dijadikan kolom sebagai primary key, jangan lupa ditambahkan anotasi @Embeddable
. Dengan menggunakan @Embeddable
entitas MahasiswaPK dapat disisipkan dalam entitas yang lain, entitas lain tersebut adalah Mahasiswa
. Dapat dilihat seperti berikut ini
Entity
@Table(name = "mahasiswa")
public class Mahasiswa implements Serializable {
@EmbeddedId
private MahasiswaPK mhs_pk;
@Column(name = "nama", nullable = false, length = 50)
private String nama;
@Column(name = "ipk", nullable = false, length = 4)
private float ipk;
@Column(name = "jurusan", nullable = false, length = 50)
private String jurusan;
public Mahasiswa() {
}
public Mahasiswa(MahasiswaPK mhs_pk, String nama, float ipk, String jurusan) {
this.mhs_pk = mhs_pk;
this.nama = nama;
this.ipk = ipk;
this.jurusan = jurusan;
}
//Getter dan setter silakan generate menggunakan IDE
Dengan menambahkan @EmbeddedId
maka field-field yang terdapat pada entitas MahasiswaPK
akan ditambahkan ke dalam entitas Mahasiswa
, sehingga hibernate akan membuatkan tabel mahasiswa
dengan primary key nim
dan no_telf
.
Composite identifier menggunakan @IdClass
{#Composite-identifier-menggunakan-@IdClass}
Masih mirip-mirip dengan yang di atas bahwa @IdClass
membutuhkan entitas yang lain, bedanya adalah field-field harus ditulis pada entitas yang membutuhkan identifier. Untuk lebih jelasnya kita lihat potongan kode di bawah ini
@Entity
@Table(name = "mahasiswa")
@IdClass(MahasiswaPK.class)
public class Mahasiswa implements Serializable {
@Id
private String nim;
@Id
private String no_telf;
@Column(name = "nama", nullable = false, length = 50)
private String nama;
@Column(name = "ipk", nullable = false, length = 4)
private float ipk;
@Column(name = "jurusan", nullable = false, length = 50)
private String jurusan;
public Mahasiswa() {
}
public Mahasiswa(String nim, String no_telf, String nama, float ipk, String jurusan) {
this.nim = nim;
this.no_telf = no_telf;
this.nama = nama;
this.ipk = ipk;
this.jurusan = jurusan;
}
//Getter dan setter silakan generate menggunakan IDE
Pada entitas Mahasiswa
perlu ditambahkan @IdClass
dengan class apa yang menjadi identifier, selain itu juga perlu dituliskan kembali field-field MahasiswaPK
pada entitas Mahasiswa
. Sebelum deklarasi field-field perlu disisipkan @Id
, selain itu @IdClass
juga dapat ditambahkan generate nilai otomatis menggunakan @GeneratedValue
juga.
Composite identifier dengan asosiasi
Selanjutnya identifier model jenis ini menggunakan relasi @ManyToOne untuk entitas-entitas yang berelasi, sebagai contoh digambarkan dalam ERD seperti di bawahi ini
Kemudian kita akan coba mapping ke dalam class java menggunakan identifier composite, potongan program dapat dilihat pada contoh di bawah ini
@Entity
@Table(name = "buku")
public class Buku implements Serializable {
@Id
@ManyToOne(fetch = FetchType.LAZY)
private Penulis penulis;
@Id
@ManyToOne(fetch = FetchType.LAZY)
private Penerbit penerbit;
@Id
private String judul;
public Buku() {
}
public Buku(Penulis penulis, Penerbit penerbit, String judul) {
this.penulis = penulis;
this.penerbit = penerbit;
this.judul = judul;
}
//Getter dan setter silakan generate menggunakan IDE
Jika dilihat dari gambar ERD dan entitas Buku
di atas ditunjukkan relasi yang terjadi antara entitas Buku
dengan entitas Penulis
dan Penerbit
adalah Many To One, sebagai ilustrasi seorang penulis dapat menulis lebih dari satu buku dan sebuat penerbit dapat menerbitkan buku lebih dari satu. Kemudian untuk entitas Penulis
dan Penerbit
tidak ada konfigurasi yang aneh-aneh, deklarasi entitas seperti biasa.
Composite identifier dengan generated properties
Composite model jenis identifier yang terdapat identitas harus dilakukan assign manual, tidak dapat dilakukan generate misalnya menggunakan @Generated
, @CreationTimestamp
atau @ValueGenerationType
dan yang lainnya. Untuk lebih jelasnya dapat dilihat pada contoh entitas-entitas di bawah ini
@Embeddable
public class MahasiswaPK implements Serializable {
private String nim;
private String no_telf;
public MahasiswaPK() {
}
public MahasiswaPK(String nim, String no_telf) {
this.nim = nim;
this.no_telf = no_telf;
}
//Getter dan setter silakan generate menggunakan IDE
Entitas MahasiswaPK merupakan entitas yang field-fieldnya akan dijadikan identifier pada entitas yang lain, @Embeddable
digunakan untuk menginformasikan bahwa field yang di dalam entitas MahasiswaPK merupakan identifier.
@Entity
@Table(name = "mahasiswa")
public class Mahasiswa implements Serializable {
@Id
private MahasiswaPK pK;
@Column(name = "nama", nullable = false, length = 50)
private String nama;
@Column(name = "ipk", nullable = false, length = 4)
private float ipk;
@Column(name = "jurusan", nullable = false, length = 50)
private String jurusan;
public Mahasiswa() {
}
public Mahasiswa(MahasiswaPK pK, String nama, float ipk, String jurusan) {
this.pK = pK;
this.nama = nama;
this.ipk = ipk;
this.jurusan = jurusan;
}
//Getter setter silakan generate menggunakan IDE
Sedangkan entitas Mahasiswa
merupakan entitas yang akan diembed identifier dari entitas MahasiswaPK
, dengan menambahkan @Id
sebelum deklarasi instance MahasiswaPK
. Untuk kode lengkap silakan unduh di sini
Demikianlah artikel saya mengenai identifier pada framework hibernate, semoga bermanfaat dan menjadi informasi yang baru untuk temen-temen yang lagi belajar framework hibernate. Kritik dan saran masih diharapkan untuk meningkatkan kwalitas artikel-artikel yang saya tulis. ^_^