Kunci Utama Komposit di JPA

1. Perkenalan

Dalam tutorial ini, kita akan belajar tentang Composite Primary Key dan penjelasan terkait di JPA.

2. Kunci Utama Komposit

Kunci utama komposit - juga disebut kunci komposit - adalah kombinasi dari dua kolom atau lebih untuk membentuk kunci utama untuk tabel.

Di JPA, kami memiliki dua opsi untuk menentukan kunci komposit: Anotasi @IdClass dan @EmbeddedId .

Untuk menentukan kunci utama komposit, kita harus mengikuti beberapa aturan:

  • Kelas kunci utama gabungan harus publik
  • Ini harus memiliki konstruktor no-arg
  • Itu harus mendefinisikan metode equals () dan hashCode ()
  • Ini harus menjadi S erializable

3. Anotasi IdClass

Misalkan kita memiliki tabel bernama Account dan memiliki dua kolom - accountNumber, accountType - yang membentuk kunci komposit. Sekarang kita harus memetakannya di JPA.

Sesuai spesifikasi JPA, mari buat kelas AccountId dengan bidang kunci utama berikut:

public class AccountId implements Serializable { private String accountNumber; private String accountType; // default constructor public AccountId(String accountNumber, String accountType) { this.accountNumber = accountNumber; this.accountType = accountType; } // equals() and hashCode() }

Selanjutnya, mari kita kaitkan kelas AccountId dengan Akun entitas .

Untuk melakukan itu, kita perlu membuat anotasi entitas dengan anotasi @IdClass . Kita juga harus mendeklarasikan bidang dari kelas AccountId di akun entitas dan menganotasinya dengan @Id :

@Entity @IdClass(AccountId.class) public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters }

4. Anotasi EmbeddedId

@EmbeddedId adalah alternatif dari anotasi @IdClass .

Mari pertimbangkan contoh lain di mana kita harus menyimpan beberapa informasi dari sebuah Buku dengan judul dan bahasa sebagai bidang kunci utama.

Dalam kasus ini, kelas kunci utama, BookId, harus dianotasi dengan @Embeddable :

@Embeddable public class BookId implements Serializable { private String title; private String language; // default constructor public BookId(String title, String language) { this.title = title; this.language = language; } // getters, equals() and hashCode() methods }

Kemudian, kita perlu menyematkan kelas ini di entitas B ook menggunakan @EmbeddedId :

@Entity public class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters }

5. @Idlass vs @EbeddedId

Seperti yang baru saja kita lihat, perbedaan di permukaan antara keduanya adalah bahwa dengan @IdClass , kita harus menentukan kolom dua kali - sekali di AccountId dan sekali lagi di Account. Tapi, dengan @EmbeddedId kami tidak melakukannya.

Namun, ada beberapa pengorbanan lainnya.

Misalnya, struktur yang berbeda ini memengaruhi kueri JPQL yang kami tulis.

Misalnya, dengan @IdClass , kueri sedikit lebih sederhana:

SELECT account.accountNumber FROM Account account

Dengan @EmbeddedId , kita harus melakukan satu traversal ekstra:

SELECT book.bookId.title FROM Book book

Selain itu, @IdClass bisa sangat berguna di tempat di mana kita menggunakan kelas kunci komposit yang tidak bisa kita modifikasi.

Terakhir, jika kita akan mengakses bagian dari kunci komposit satu per satu, kita dapat menggunakan @IdClass, tetapi di tempat di mana kita sering menggunakan pengenal lengkap sebagai objek, @EmbeddedId lebih disukai.

6. Kesimpulan

Dalam artikel singkat ini, kami menjelajahi kunci utama komposit di JPA.

Seperti biasa, kode lengkap untuk artikel ini dapat ditemukan di Github.