Hibernate One to One Mapping Annotation Example

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.

  1. Første teknik er den mest udbredte og bruger en fremmednøglespalte i en af tabellerne.
  2. Den anden teknik bruger en ret kendt løsning med en tredje tabel til at gemme mapping mellem de to første tabeller.
  3. 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:

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.