Differenza tra @JoinColumn e mappedBy

1. Introduzione

Le relazioni JPA possono essere unidirezionali o bidirezionali. Significa semplicemente che possiamo modellarli come un attributo esattamente su una delle entità associate o su entrambe.

La definizione della direzione della relazione tra le entità non ha alcun impatto sulla mappatura del database. Definisce solo le direzioni in cui utilizziamo quella relazione nel nostro modello di dominio.

Per una relazione bidirezionale, di solito definiamo:

  • il lato proprietario
  • inverso o dal lato di riferimento

L' annotazione @JoinColumn ci aiuta a specificare la colonna che useremo per partecipare a un'associazione di entità oa una raccolta di elementi. D'altra parte, l' attributo mappedBy viene utilizzato per definire il lato di riferimento (lato non proprietario) della relazione.

In questo breve tutorial, esamineremo la differenza tra @JoinColumn e mappedBy in JPA. Presenteremo anche come usarli in un'associazione uno-a-molti.

2. Configurazione iniziale

Per seguire questo tutorial, supponiamo di avere due entità: Employee ed Email.

Chiaramente, un dipendente può avere più indirizzi email. Tuttavia, un determinato indirizzo e-mail può appartenere esattamente a un singolo dipendente.

Significa che condividono un'associazione uno-a-molti:

Anche nel nostro modello RDBMS, avremo una chiave esterna dipendente_id nella nostra entità Email che fa riferimento all'attributo id di un dipendente .

3. Annotazione @JoinColumn

In una relazione uno-a-molti / molti-a-uno, il lato proprietario è solitamente definito sul lato " molti" della relazione. Di solito è il lato che possiede la chiave esterna.

L' annotazione @JoinColumn definisce quella mappatura fisica effettiva sul lato proprietario:

@Entity public class Email { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "employee_id") private Employee employee; // ... }

Essa significa semplicemente che la nostra e-mail entità avrà una colonna chiave esterna denominata employee_id riferendosi al primario attributo id del nostro Employee entità.

4. mappedBy Attribute

Una volta definito il lato proprietario della relazione, Hibernate dispone già di tutte le informazioni necessarie per mappare quella relazione nel nostro database. Per rendere questa associazione bidirezionale, tutto ciò che dovremo fare è definire il lato di riferimento. Il lato inverso o di riferimento si mappa semplicemente sul lato proprietario.

Siamo in grado di usare facilmente il mappedBy attributo del @OneToMany annotazioni di farlo. Quindi, definiamo la nostra entità Employee :

@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") private List emails; // ... }

Qui, il valore di mappedBy è il nome dell'attributo di mappatura dell'associazione sul lato proprietario. Con questo, abbiamo ora stabilito un'associazione bidirezionale tra le nostre entità Dipendenti e Email .

5. conclusione

In questo tutorial, abbiamo esaminato la differenza tra @JoinColumn e mappedBy e come usarli in una relazione bidirezionale uno-a-molti.

L' annotazione @JoinColumn definisce la mappatura fisica effettiva sul lato proprietario. D'altro canto, il lato riferimento è definita secondo la mappedBy attributo della @OneToMany annotazione.

Come al solito, il codice sorgente è disponibile su Github.