JPA @Embedded Dan @Embeddable

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat bagaimana kita dapat memetakan satu entiti yang mengandungi sifat tertanam ke satu jadual pangkalan data.

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

2. Konteks Model Data

Pertama sekali, mari kita tentukan jadual yang disebut syarikat .

Jadual syarikat akan menyimpan maklumat asas seperti nama syarikat, alamat, dan telefon, serta maklumat orang yang dihubungi:

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 }

Walaupun begitu, orang yang dihubungi sepertinya harus diasingkan ke kelas yang berasingan. Masalahnya ialah kita tidak mahu membuat jadual berasingan untuk perincian tersebut. Oleh itu, mari kita lihat apa yang boleh kita lakukan.

3. @ Boleh Dikemas kini

JPA memberikan penjelasan @Embeddable untuk menyatakan bahawa kelas akan disertakan oleh entiti lain.

Mari tentukan kelas untuk mengaburkan maklumat orang hubungan:

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

4. @Dipasangkan

Anotasi JPA @Embedded digunakan untuk memasukkan jenis ke entiti lain.

Mari kita ubah kelas Syarikat kita seterusnya . Kami akan menambahkan penjelasan JPA dan kami juga akan menukar untuk menggunakan ContactPerson dan bukannya bidang yang berasingan:

@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 }

Akibatnya, kami mempunyai Syarikat entiti kami , menyertakan maklumat orang hubungan, dan memetakan ke satu jadual pangkalan data.

Kami masih mempunyai satu masalah lagi, dan itulah bagaimana JPA akan memetakan bidang ini ke lajur pangkalan data.

5. Atribut Mengatasi

Masalahnya ialah bahawa bidang kita dipanggil perkara seperti contactFirstName dalam asal kami Syarikat kelas dan kini firstName dalam kita ContactPerson kelas. Oleh itu, JPA ingin memetakannya ke contact_first_name dan first_name .

Selain kurang ideal, ia sebenarnya akan mematahkan kita dengan lajur telefon kita yang kini digandakan .

Oleh itu, kita boleh menggunakan @AttributeOverrides dan @AttibuteOverride untuk mengatasi sifat lajur jenis terbenam kami.

Mari tambahkan ini ke medan ContactPerson di entiti Syarikat kami :

@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 bahawa, kerana anotasi ini ada di lapangan, kita boleh mempunyai penggantian yang berbeza untuk setiap entiti yang melampirkan.

6. Kesimpulannya

Dalam tutorial ini, kami telah mengkonfigurasi entiti dengan beberapa atribut tertanam dan memetakannya ke jadual pangkalan data yang sama dengan entiti yang melampirkan. Untuk itu, kami menggunakan anotasi @Embedded , @Embeddable , @AttributeOverrides dan @AttributeOverride yang disediakan oleh Java Persistence API.

Seperti biasa, kod sumber contoh boleh didapati di GitHub.