Verschil tussen @JoinColumn en mappedBy

1. Inleiding

JPA-relaties kunnen zowel unidirectioneel als bidirectioneel zijn. Het betekent simpelweg dat we ze kunnen modelleren als een attribuut op precies een van de geassocieerde entiteiten of beide.

Het bepalen van de richting van de relatie tussen entiteiten heeft geen invloed op de databasetoewijzing. Het definieert alleen de richtingen waarin we die relatie gebruiken in ons domeinmodel.

Voor een bidirectionele relatie definiëren we meestal:

  • de bezitterige kant
  • inverse of de verwijzende zijde

De @JoinColumn annotatie helpt ons de kolom te specificeren die we zullen gebruiken om lid te worden van een entiteitsassociatie of elementverzameling. Aan de andere kant is het mappedBy attribuut wordt gebruikt om de verwijzende kant (niet-eigenaar) van de relatie te definiëren.

In deze korte tutorial zullen we kijken naar het verschil tussen @JoinColumn en mappedByin JPA. We zullen ook laten zien hoe u ze kunt gebruiken in een een-op-veel-associatie.

2. Eerste installatie

Laten we, om deze tutorial te volgen, zeggen dat we twee entiteiten hebben: Werknemer en E-mail.

Het is duidelijk dat een werknemer meerdere e-mailadressen kan hebben. Een bepaald e-mailadres kan echter exact bij één werknemer horen.

Het betekent dat ze een een-op-veel-associatie delen:

Ook in ons RDBMS-model hebben we een externe sleutel employee_id in onze E-mail entiteit die verwijst naar de ID kaart attribuut van een Werknemer.

3. @JoinColumn Annotatie

In een één-op-veel / veel-op-één-relatie, de kant van het bezit wordt meestal gedefinieerd aan de ‘veel' kant van de relatie. Het is meestal de kant die de externe sleutel bezit.

De @JoinColumn annotatie definieert die feitelijke fysieke toewijzing aan de kant van de eigenaar:

@Entity openbare klasse E-mail {@Id @GeneratedValue (strategie = GenerationType.AUTO) privé Lange id; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn (naam = "employee_id") privé medewerker medewerker; // ...}

Het betekent gewoon dat onze E-mail entiteit krijgt een kolom met een externe sleutel met de naam employee_id verwijzend naar het primaire kenmerk ID kaart van onze Werknemer entiteit.

4. mappedBy Attribuut

Zodra we de eigenaarskant van de relatie hebben gedefinieerd, heeft Hibernate al alle informatie die nodig is om die relatie in onze database in kaart te brengen. Om deze associatie bidirectioneel te maken, hoeven we alleen maar de referentiekant te definiëren. De inverse of de verwijzende kant wordt eenvoudig toegewezen aan de bezitterige kant.

We kunnen gemakkelijk de mappedBy kenmerk van @Een te veel annotatie om dit te doen. Dus laten we onze definiëren Werknemer entiteit:

@Entity openbare klasse Medewerker {@Id @GeneratedValue (strategie = GenerationType.AUTO) privé Lange id; @OneToMany (fetch = FetchType.LAZY, mappedBy = "werknemer") privélijst e-mails; // ...}

Hier, de waarde van mappedBy is de naam van het kenmerk van de associatie-toewijzing aan de kant van de eigenaar. Hiermee hebben we nu een bidirectionele associatie tot stand gebracht tussen onze Werknemer en E-mail entiteiten.

5. Conclusie

In deze tutorial hebben we gekeken naar het verschil tussen @JoinColumn en mappedBy en hoe u ze kunt gebruiken in een een-op-veel bidirectionele relatie.

De @JoinColumn annotatie definieert de feitelijke fysieke mapping aan de kant van de eigenaar. Aan de andere kant wordt de verwijzende zijde gedefinieerd met behulp van de mappedBy attribuut van de @Een te veel annotatie.

Zoals gewoonlijk is de broncode beschikbaar op Github.