JPA @Embedded und @Embeddable

1. Übersicht

In diesem Lernprogramm erfahren Sie, wie Sie eine Entität, die eingebettete Eigenschaften enthält, einer einzelnen Datenbanktabelle zuordnen können.

Zu diesem Zweck verwenden wir die Annotationen @Embeddable und @Embedded, die von der Java Persistence API (JPA) bereitgestellt werden.

2. Datenmodellkontext

Definieren wir zunächst eine Tabelle mit dem Namen company .

Die Firma Tabelle speichert grundlegende Informationen wie Firmenname, Adresse und Telefon, sowie die Informationen einer Kontaktperson:

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 }

Die Kontaktperson scheint jedoch in eine separate Klasse abstrahiert zu werden. Das Problem ist, dass wir für diese Details keine separate Tabelle erstellen möchten. Mal sehen, was wir tun können.

3. @Embeddable

JPA stellt die Annotation @Embeddable bereit, um zu deklarieren, dass eine Klasse von anderen Entitäten eingebettet wird.

Definieren wir eine Klasse, um die Details der Kontaktperson zu abstrahieren:

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

4. @ Eingebettet

Die JPA-Annotation @Embedded wird verwendet, um einen Typ in eine andere Entität einzubetten.

Lassen Sie uns als nächstes unsere Unternehmensklasse ändern . Wir werden die JPA-Anmerkungen hinzufügen und ContactPerson anstelle separater Felder verwenden:

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

Infolgedessen haben wir unser Unternehmen , das Kontaktpersonendaten einbettet und einer einzelnen Datenbanktabelle zuordnet.

Wir haben jedoch noch ein weiteres Problem, und auf diese Weise ordnet JPA diese Felder Datenbankspalten zu.

5. Attribute überschreiben

Die Sache ist die, dass unsere Felder Dinge wie genannt wurden contactFirstName in unserer ursprünglichen Firmen Klasse und jetzt Vornamen in unserer Contact Klasse. Daher möchte JPA diese dem ersten Vornamen bzw. dem ersten Vornamen zuordnen .

Abgesehen davon, dass es nicht ideal ist, wird es uns tatsächlich mit unserer jetzt duplizierten Telefonspalte brechen .

Wir können also @AttributeOverrides und @AttibuteOverride verwenden , um die Spalteneigenschaften unseres eingebetteten Typs zu überschreiben.

Fügen wir dies dem Feld ContactPerson in unserer Unternehmenseinheit hinzu :

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

Beachten Sie, dass wir, da diese Anmerkungen im Feld enthalten sind, für jede einschließende Entität unterschiedliche Überschreibungen haben können.

6. Fazit

In diesem Lernprogramm haben wir eine Entität mit einigen eingebetteten Attributen konfiguriert und sie derselben Datenbanktabelle wie die einschließende Entität zugeordnet. Zu diesem Zweck haben wir die von der Java Persistence API bereitgestellten Annotationen @Embedded , @Embeddable , @AttributeOverrides und @AttributeOverride verwendet .

Wie immer ist der Quellcode des Beispiels auf GitHub verfügbar.