Dacă lucrăm la o aplicație hibernate sau plănuim să lucrăm la una în viitor, atunci puteți înțelege cu ușurință relațiile unu-la-unu între mai multe entități din aplicație. În acest exemplu de cartografiere unu la unu hibernate, Vom discuta 4 variante diferite.
Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId
Pentru acest exemplu de cartografiere unu la unu hibernate, extind exemplul scris pentru exemplul hibernate hello world. Avem două entități aici: Employee
și Account
.
Un angajat poate avea doar un singur cont. În mod similar, un cont va fi asociat cu un singur angajat. Este o relație unu la unu pentru acest exemplu.
Diverse tehnici suportate
În hibernate există 3 moduri de a crea relații unu la unu între două entități. În ambele moduri trebuie să folosim adnotarea @OneToOne.
- Prima tehnică este cea mai utilizată și folosește o coloană de cheie externă în unul dintre tabele.
- A doua tehnică utilizează o soluție destul de cunoscută de a avea o a treia tabelă pentru a stoca corespondența între primele două tabele.
- A treia tehnică este ceva nou care utilizează o valoare comună a cheii primare în ambele tabele.
Hibernate one to one mapping with foreign key association
În acest tip de asociere, o coloană de cheie externă este creată în entitatea proprietar. De exemplu, dacă facem EmployeeEntity proprietar, atunci o coloană suplimentară "ACCOUNT_ID"
va fi creată în tabelul Employee
. Această coloană va stoca cheia externă pentru tabela Account
.
Structura tabelei va fi următoarea:
Pentru a realiza o astfel de asociere, faceți referire la entitatea Account
din clasa EmployeeEntity
după cum urmează:
@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;
Columna de asociere este declarată cu adnotarea @JoinColumn, care seamănă cu adnotarea @Column. Aceasta are încă un parametru numit referencedColumnName
. Acest parametru declară coloana din entitatea vizată care va fi utilizată pentru alăturare.
Dacă nu este declarat nici un @JoinColumn
pe partea proprietarului, se aplică valorile implicite. O coloană (coloane) de îmbinare va (vor) fi creată(e) în tabelul proprietarului, iar numele acesteia va fi concatenarea numelui relației din partea proprietarului, _ (subliniere), și numele coloanei (coloanelor) cu cheie primară din partea proprietarului.
Într-o relație bidirecțională, una dintre părți (și numai una) trebuie să fie proprietarul. Proprietarul este responsabil pentru actualizarea coloanei (coloanelor) de asociere. Pentru a declara o parte ca nefiind responsabilă de relație, se utilizează atributul mappedBy. ‘mappedBy’ se referă la numele proprietății asociației din partea proprietarului.
@OneToOne(mappedBy="account")private EmployeeEntity employee;
Atributul „above "mappedBy
” declară că depinde de entitatea proprietar pentru cartografiere.
Să testăm corespondențele de mai sus în codul de execuție:
Executarea codului de mai sus creează schema dorită în baza de date și execută aceste interogări SQL.
Puteți verifica datele și mapările din ambele tabele atunci când executați programul de mai sus.
Hibernate one to one mapping with common join table
Această abordare nu este nouă pentru noi toți. Să începem cu structura BD vizată în această tehnică.
În această tehnică, principala adnotare care trebuie utilizată este @JoinTable. Această adnotare este utilizată pentru a defini noul nume de tabel (obligatoriu) și cheile străine din ambele tabele. Să vedem cum este utilizată:
Anotarea @JoinTable este utilizată în clasa EmployeeEntity
. Aceasta declară că o nouă tabelă EMPLOYEE_ACCOUNT
va fi creată cu două coloane EMPLOYEE_ID
(cheia primară a tabelei EMPLOYEE) și ACCOUNT_ID
(cheia primară a tabelei ACCOUNT).
Testarea entităților de mai sus generează următoarele interogări SQL în fișierele jurnal:
Hibernate one to one mapping with shared primary key
În această tehnică, hibernate se va asigura că va utiliza o valoare comună a cheii primare în ambele tabele. În acest fel, cheia primară din EmployeeEntity
poate fi considerată în siguranță ca fiind cheia primară și pentru AccountEntity
.
Structura tabelelor va fi următoarea:
În această abordare, @PrimaryKeyJoinColumn este principala adnotare care trebuie utilizată. Să vedem cum să o folosim.
@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;
În partea AccountEntity
, aceasta va rămâne dependentă de entitatea proprietar pentru cartografiere.
@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;
Testarea entităților de mai sus generează următoarele interogări SQL în fișierele jurnal:
Hibernate one to one mapping with @MapsId
În această tehnică, hibernate presupune că atât sursa cât și ținta au aceleași valori ale cheii primare.
În această abordare, @MapsId este principala adnotare care trebuie utilizată. Să vedem cum să o folosim.
@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;
În partea AccountEntity
, aceasta va rămâne dependentă de entitatea proprietar pentru cartografiere.
@Idprivate Integer accountId;
Testarea entităților de mai sus generează următoarele interogări SQL în fișierele jurnal: