Kunci Utama Komposit dalam JPA

1. Pengenalan

Dalam tutorial ini, kita akan belajar mengenai Kunci Utama Komposit dan anotasi yang sesuai dalam JPA.

2. Kekunci Utama Komposit

Kekunci utama komposit - juga dipanggil kunci komposit - adalah gabungan dua atau lebih lajur untuk membentuk kunci utama untuk jadual.

Di JPA, kita mempunyai dua pilihan untuk menentukan kunci komposit: The @IdClass dan @EmbeddedId penjelasan.

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

  • Kelas kunci utama komposit mestilah umum
  • Ia mesti mempunyai konstruktor tanpa argumen
  • Ia mesti menentukan kaedah sama dengan () dan hashCode ()
  • Ia mesti S erializable

3. Anotasi IdClass

Katakan kita mempunyai jadual bernama Akaun dan ia mempunyai dua lajur - nombor akaun, jenis akaun - yang membentuk kunci gabungan. Sekarang kita harus memetakannya di JPA.

Mengikut spesifikasi JPA, mari buat kelas AccountId dengan bidang utama utama ini:

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() }

Seterusnya, mari kita kaitkan kelas AccountId dengan entiti Akaun .

Untuk melakukannya, kita perlu memberi penjelasan kepada entiti dengan anotasi @IdClass . Kami juga mesti menyatakan medan dari kelas AccountId dalam akaun entiti dan memberi anotasinya 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 untuk penjelasan @IdClass .

Mari kita pertimbangkan contoh lain di mana kita harus menyimpan beberapa maklumat Buku dengan tajuk dan bahasa sebagai bidang utama.

Dalam kes ini, kelas utama utama, BookId, mesti diberi anotasi 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 memasukkan kelas ini dalam entiti B ook menggunakan @EmbeddedId :

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

5. @IdClass vs @EmbeddedId

Seperti yang baru kita lihat, perbezaan permukaan antara keduanya adalah dengan @IdClass , kita harus menentukan lajur dua kali - sekali di AccountId dan sekali lagi di Akaun. Tetapi, dengan @EmbeddedId kami tidak.

Terdapat beberapa pertukaran lain.

Sebagai contoh, struktur yang berbeza ini mempengaruhi pertanyaan JPQL yang kita tulis.

Contohnya, dengan @IdClass , pertanyaannya sedikit lebih mudah:

SELECT account.accountNumber FROM Account account

Dengan @EmbeddedId , kita perlu melakukan satu traversal tambahan:

SELECT book.bookId.title FROM Book book

Juga, @IdClass boleh berguna di tempat-tempat di mana kita menggunakan kelas kunci komposit yang tidak dapat kita ubah.

Akhirnya, jika kita akan mengakses bahagian kunci komposit secara individu, kita dapat menggunakan @IdClass, tetapi di tempat di mana kita sering menggunakan pengenal lengkap sebagai objek, @EmbeddedId lebih disukai.

6. Kesimpulannya

Dalam artikel ringkas ini, kami meneroka kunci utama gabungan dalam JPA.

Seperti biasa, kod lengkap untuk artikel ini terdapat di Github.