JPA @Ebedded Dan @Ebeddable

1. Ikhtisar

Dalam tutorial ini, kita akan melihat bagaimana kita bisa memetakan satu entitas yang berisi properti yang disematkan ke tabel database tunggal.

Jadi, untuk tujuan ini, kita akan menggunakan @Embeddable dan @Embedded penjelasan yang diberikan oleh API Java Persistence (JPA).

2. Konteks Model Data

Pertama-tama, mari kita definisikan tabel bernama perusahaan .

The perusahaan table akan menyimpan informasi dasar seperti nama perusahaan, alamat, dan telepon, serta informasi dari contact person:

public class Company { private Integer id; private String name; private String address; private String phone; private String contactFirstName; private String contactLastName; private String contactPhone; // standard getters, setters }

Namun, penghubung tampaknya harus dipisahkan ke kelas yang terpisah. Masalahnya adalah kami tidak ingin membuat tabel terpisah untuk detail tersebut. Jadi, mari kita lihat apa yang bisa kita lakukan.

3. @Ebeddable

JPA menyediakan anotasi @Embeddable untuk menyatakan bahwa kelas akan disematkan oleh entitas lain.

Mari tentukan kelas untuk mengabstraksi detail kontak orang:

@Embeddable public class ContactPerson { private String firstName; private String lastName; private String phone; // standard getters, setters }

4. @Tempat tidur

Anotasi JPA @Embedded digunakan untuk menyematkan tipe ke entitas lain.

Selanjutnya mari kita ubah kelas Perusahaan kita . Kami akan menambahkan anotasi JPA dan kami juga akan mengubah untuk menggunakan ContactPerson alih-alih bidang terpisah:

@Entity public class Company { @Id @GeneratedValue private Integer id; private String name; private String address; private String phone; @Embedded private ContactPerson contactPerson; // standard getters, setters }

Hasilnya, kami memiliki Perusahaan entitas kami , menyematkan detail kontak orang, dan memetakan ke tabel database tunggal.

Kami masih memiliki satu masalah lagi, yaitu bagaimana JPA akan memetakan field ini ke kolom database.

5. Atribut Menimpa

Masalahnya adalah bahwa bidang kita disebut hal-hal seperti contactFirstName di kelas Perusahaan asli kita dan sekarang firstName di kelas ContactPerson kita . Jadi, JPA ingin memetakan ini masing-masing ke contact_first_name dan first_name .

Selain kurang dari ideal, itu benar-benar akan merusak kita dengan kolom telepon kita yang sekarang digandakan .

Jadi, kita bisa menggunakan @AttributeOverrides dan @AttibuteOverride untuk menimpa properti kolom dari tipe yang disematkan.

Mari tambahkan ini ke bidang ContactPerson di entitas Perusahaan kita :

@Embedded @AttributeOverrides({ @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")), @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")), @AttributeOverride( name = "phone", column = @Column(name = "contact_phone")) }) private ContactPerson contactPerson;

Perhatikan bahwa, karena anotasi ini ditempatkan di lapangan, kita dapat memiliki penggantian yang berbeda untuk setiap entitas yang melingkupinya.

6. Kesimpulan

Dalam tutorial ini, kami telah mengonfigurasi entitas dengan beberapa atribut yang disematkan dan memetakannya ke tabel database yang sama dengan entitas yang melampirkan. Untuk itu, kami menggunakan anotasi @Embedded , @Embeddable , @AttributeOverrides , dan @AttributeOverride yang disediakan oleh Java Persistence API.

Seperti biasa, kode sumber dari contoh ini tersedia di GitHub.