Hvis vi arbejder på en hibernate-applikation, eller hvis vi planlægger at arbejde på en i fremtiden, kan du nemt forstå en-til-en-relationer mellem flere enheder i applikationen. I dette hibernate en til en mapping eksempel, Vi vil diskutere 4 forskellige variationer.
Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId
For dette hibernate en til en mapping eksempel udvider jeg det eksempel, der er skrevet til hibernate hello world eksempel. Vi har to enheder her: Employee
og Account
.
En medarbejder kan kun have én konto. Tilsvarende vil en konto kun være forbundet med én medarbejder. Det er en til en-relation for dette eksempel.
Various supported techniques
I hibernate er der 3 måder at skabe en til en-relationer mellem to entiteter på. På begge måder skal vi bruge @OneToOne-annotationen.
- Første teknik er den mest udbredte og bruger en fremmednøglespalte i en af tabellerne.
- Den anden teknik bruger en ret kendt løsning med en tredje tabel til at gemme mapping mellem de to første tabeller.
- Den tredje teknik er noget nyt, som bruger en fælles primærnøgleværdi i begge tabeller.
Hibernate en til en-mapping med fremmednøgleassociation
I denne form for association oprettes en fremmednøglespalte i ejerentiteten. Hvis vi f.eks. gør EmployeeEntity til ejer, oprettes der en ekstra kolonne "ACCOUNT_ID"
i tabellen Employee
. Denne kolonne vil gemme den fremmede nøgle for Account
-tabellen.
Tabelstrukturen vil se således ud:
For at lave en sådan tilknytning skal du henvise til Account
-entiteten i EmployeeEntity
-klassen som følger:
@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;
Sammenføjningskolonnen er erklæret med annotationen @JoinColumn, der ligner @Column-annotationen. Den har endnu en parameter ved navn referencedColumnName
. Denne parameter angiver den kolonne i den målrettede enhed, der skal bruges til sammenføjningen.
Hvis der ikke er angivet noget @JoinColumn
på ejersiden, gælder standardværdierne. Der oprettes en eller flere join-kolonne(r) i ejertabellen, og dens navn vil være sammenkædningen af navnet på relationen på ejersiden, _ (understregning), og navnet på primærnøglekolonnen(erne) på ejersiden.
I en tovejsrelation skal en af siderne (og kun den ene) være ejer. Ejeren er ansvarlig for opdateringen af forbindelseskolonnen(-kolonnerne). For at erklære en side som ikke ansvarlig for relationen anvendes attributten mappedBy. ‘mappedBy’ henviser til egenskabsnavnet for foreningen på ejersiden.
@OneToOne(mappedBy="account")private EmployeeEntity employee;
Overstående "mappedBy
” attribut erklærer, at den er afhængig af ejerentiteten for mapping.
Lader os teste ovenstående mappinger i kørende kode:
Kørsel af ovenstående kode opretter ønsket skema i databasen og kører disse SQL-forespørgsler.
Du kan verificere data og mappinger i begge tabeller, når du kører ovenstående program.
Hibernate en til en mapping med fælles join-tabel
Denne tilgang er ikke ny for os alle. Lad os starte med målrettet DB-struktur i denne teknik.
I denne teknik er den vigtigste annotation, der skal bruges, @JoinTable. Denne annotation bruges til at definere det nye bordnavn (obligatorisk) og fremmednøgler fra begge tabeller. Lad os se, hvordan den bruges:
@JoinTable-annotationen bruges i EmployeeEntity
-klassen. Den erklærer, at der oprettes en ny tabel EMPLOYEE_ACCOUNT
med to kolonner EMPLOYEE_ID
(primær nøgle i tabellen EMPLOYEE) og ACCOUNT_ID
(primær nøgle i tabellen ACCOUNT).
Test af ovenstående enheder genererer følgende SQL-forespørgsler i logfilerne:
Hibernate en til en mapping med delt primær nøgle
I denne teknik sikrer hibernate, at den vil bruge en fælles primær nøgleværdi i begge tabeller. På denne måde kan primærnøglen i EmployeeEntity
sikkert antages at være primærnøglen i AccountEntity
også.
Tabelstrukturen vil se således ud:
I denne fremgangsmåde er @PrimaryKeyJoinColumn den vigtigste annotation, der skal bruges. Lad os se, hvordan den skal bruges.
@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;
I AccountEntity
side vil den forblive afhængig af ejerenheden for mapping.
@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;
Test af ovenstående enheder genererer følgende SQL-forespørgsler i logfiler:
Hibernate en til en mapping med @MapsId
I denne teknik antager hibernate, at både kilde og mål deler de samme primary key-værdier.
I denne fremgangsmåde er @MapsId den vigtigste annotation, der skal bruges. Lad os se, hvordan den skal bruges.
@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;
I AccountEntity
side vil den fortsat være afhængig af ejerentiteten for mapping.
@Idprivate Integer accountId;
Test af ovenstående enheder genererer følgende SQL-forespørgsler i logfiler: