JPA @Embedded And @Embeddable

1. Oversigt

I denne vejledning ser vi, hvordan vi kan kortlægge en enhed, der indeholder integrerede egenskaber, til en enkelt databasetabel.

Så til dette formål bruger vi @Embeddable og @Embedded bemærkninger leveret af Java Persistence API (JPA).

2. Data Model Context

Lad os først definere en tabel, der hedder Selskab.

Det Selskab Tabellen gemmer grundlæggende oplysninger såsom firmanavn, adresse og telefon samt oplysninger om en kontaktperson:

offentlig klasse virksomhed {privat heltal id; privat strengnavn; privat strengadresse; privat String telefon; privat streng contactFirstName; privat streng contactLastName; privat streng kontakt telefon; // standard getters, setters}

Kontaktpersonen ser dog ud til, at den skal uddrages til en separat klasse. Problemet er, at vi ønsker ikke at oprette en separat tabel til disse detaljer. Så lad os se, hvad vi kan gøre.

3. @Embeddable

JPA leverer @Embeddable kommentar for at erklære, at en klasse vil blive indlejret af andre enheder.

Lad os definere en klasse, der skal abstrakte kontaktpersonoplysningerne:

@Embeddable public class ContactPerson {privat streng fornavn; privat streng efternavn; privat String telefon; // standard getters, setters}

4. @Embedded

JPA-kommentaren @Embedded bruges til at integrere en type i en anden enhed.

Lad os derefter ændre vores Selskab klasse. Vi tilføjer JPA-kommentarerne, og vi skifter også til brug Kontaktperson i stedet for separate felter:

@Entity public class Company {@Id @GeneratedValue private Integer id; privat strengnavn; privat strengadresse; privat String telefon; @Embedded privat ContactPerson contactPerson; // standard getters, setters}

Som et resultat har vi vores enhed Selskab, indlejring af kontaktpersonoplysninger og kortlægning til en enkelt databasetabel.

Vi har dog stadig et problem mere, og det er hvordan JPA vil kortlægge disse felter til databasekolonner.

5. Attributter tilsidesættes

Sagen er, at vores marker blev kaldt ting som contactFirstName i vores original Selskab klasse og nu fornavn i vores Kontaktperson klasse. Så JPA vil kortlægge disse til contact_first_name og fornavn, henholdsvis.

Bortset fra at være mindre end ideel, vil det faktisk bryde os med vores nu duplikerede telefon kolonne.

Så vi kan bruge @AttributeOverrides og @AttibuteOverride for at tilsidesætte kolonneegenskaberne for vores indlejrede type.

Lad os tilføje dette til Kontaktperson felt i vores Selskab enhed:

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

Bemærk, at da disse kommentarerne kommer på marken, kan vi have forskellige tilsidesættelser for hver indesluttende enhed.

6. Konklusion

I denne vejledning har vi konfigureret en enhed med nogle indlejrede attributter og kortlagt dem til den samme databasetabel som den vedlagte enhed. Til det brugte vi @Embedded, @Embeddable, @AttributeOverrides og @AttributeOverride bemærkninger leveret af Java Persistence API.

Som altid er kildekoden til eksemplet tilgængelig på GitHub.