JPA @Embedded en @Embeddable

1. Overzicht

In deze zelfstudie zullen we zien hoe we een entiteit die ingesloten eigenschappen bevat, kunnen toewijzen aan een enkele databasetabel.

Dus voor dit doel gebruiken we de @Embeddable en @Embedded annotaties geleverd door de Java Persistence API (JPA).

2. Gegevensmodelcontext

Laten we eerst een tabel definiëren met de naam bedrijf.

De bedrijf table slaat basisinformatie op zoals bedrijfsnaam, adres en telefoonnummer, evenals de informatie van een contactpersoon:

openbare klasse Bedrijf {privé Geheel getal id; private String naam; privé String-adres; privé String-telefoon; private String contactFirstName; private String contactLastName; privé String contactPhone; // standaard getters, setters}

De contactpersoon lijkt echter te moeten worden geabstraheerd naar een aparte klas. Het probleem is dat we willen geen aparte tabel maken voor die details. Laten we dus eens kijken wat we kunnen doen.

3. @Embeddable

JPA biedt de @Embeddable annotatie om aan te geven dat een klasse wordt ingesloten door andere entiteiten.

Laten we een klasse definiëren om de details van de contactpersoon te abstraheren:

@Embeddable openbare klasse ContactPerson {private String firstName; private String achternaam; privé String-telefoon; // standaard getters, setters}

4. @Embedded

De annotatie van de PPV @Embedded wordt gebruikt om een ‚Äč‚Äčtype in een andere entiteit in te bedden.

Laten we vervolgens onze Bedrijf klasse. We voegen de JPA-annotaties toe en we gaan ook over op gebruik Contactpersoon in plaats van aparte velden:

@Entity openbare klasse Bedrijf {@Id @GeneratedValue privé Geheel getal-id; private String naam; privé String-adres; privé String-telefoon; @Embedded privé contactpersoon contactpersoon; // standaard getters, setters}

Als resultaat hebben we onze entiteit Bedrijf, het insluiten van contactgegevens van de contactpersoon en het toewijzen aan een enkele databasetabel.

We hebben echter nog een probleem, en dat is hoe JPA deze velden toewijst aan databasekolommen.

5. Attributen overschrijven

Het punt is dat onze velden zo werden genoemd contactFirstName in ons origineel Bedrijf klasse en nu Voornaam in onze Contactpersoon klasse. Dus de PPV zal deze willen toewijzen aan contact_first_name en Voornaam, respectievelijk.

Behalve dat het niet ideaal is, zal het ons in feite breken met onze nu gedupliceerde telefoon kolom.

Dus we kunnen gebruiken @AttributeOverrides en @BuienRadarNL om de kolomeigenschappen van ons ingebedde type te overschrijven.

Laten we dit toevoegen aan het Contactpersoon veld in ons Bedrijf entiteit:

@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"))}) privé contactpersoon contactpersoon;

Merk op dat, aangezien deze annotaties in het veld komen, we verschillende overschrijvingen kunnen hebben voor elke omsluitende entiteit.

6. Conclusie

In deze zelfstudie hebben we een entiteit geconfigureerd met enkele ingesloten attributen en deze toegewezen aan dezelfde databasetabel als de omringende entiteit. Daarvoor hebben we de @Embedded, @Embeddable, @AttributeOverrides en @AttributeOverride annotaties geleverd door de Java Persistence API.

Zoals altijd is de broncode van het voorbeeld beschikbaar op GitHub.