Om vi arbetar med någon hibernate-applikation eller planerar att arbeta med någon i framtiden kan du lätt förstå en-till-en-relationer mellan flera enheter i applikationen. I detta hibernate ett till ett mappningsexempel kommer vi att diskutera 4 olika varianter.
Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId
För detta hibernate ett till ett mappningsexempel utökar jag exemplet som är skrivet för hibernate hello world exempel. Vi har två enheter här: Employee
och Account
.
En anställd kan bara ha ett konto. På samma sätt kommer ett konto att associeras med endast en anställd. Det är ett ett till ett förhållande för det här exemplet.
Varierade tekniker som stöds
I hibernate finns det 3 sätt att skapa ett till ett förhållande mellan två entiteter. På båda sätten måste vi använda @OneToOne-annotationen.
- Den första tekniken är den mest använda och använder en främmande nyckelkolumn i en av tabellerna.
- Den andra tekniken använder en ganska känd lösning där man har en tredje tabell för att lagra mappning mellan de två första tabellerna.
- Den tredje tekniken är något nytt som använder ett gemensamt primärnyckelvärde i båda tabellerna.
Hibernate en till en mappning med en främmande nyckelassociation
I den här typen av association skapas en kolumn med en främmande nyckel i enheten owner. Om vi till exempel gör EmployeeEntity till ägare skapas en extra kolumn "ACCOUNT_ID"
i tabellen Employee
. Denna kolumn kommer att lagra den främmande nyckeln för Account
tabellen.
Tabellstrukturen kommer att se ut så här:
För att göra en sådan association hänvisar du till Account
entiteten i EmployeeEntity
klassen på följande sätt:
@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;
Förbindelsekolumnen deklareras med @JoinColumn-annotationen, som ser ut som @Column-annotationen. Den har ytterligare en parameter som heter referencedColumnName
. Denna parameter deklarerar kolumnen i den målinriktade enheten som kommer att användas för sammanfogningen.
Om ingen @JoinColumn
deklareras på ägarens sida gäller standardvärdena. En eller flera sammanfogningskolumner kommer att skapas i ägartabellen och dess namn kommer att vara en sammanfogning av namnet på relationen på ägarsidan, _ (understrykning), och namnet på primärnyckelkolumnen eller primärnyckelkolumnerna på den ägda sidan.
I en dubbelriktad relation måste en av sidorna (och endast en) vara ägaren. Ägaren är ansvarig för uppdateringen av associationskolumnen/kolumnerna. För att förklara att en sida inte är ansvarig för relationen används attributet mappedBy. ’mappedBy’ hänvisar till egenskapsnamnet för associationen på ägarsidan.
@OneToOne(mappedBy="account")private EmployeeEntity employee;
Attributet ovan "mappedBy
” förklarar att det är beroende av ägarentiteten för mappning.
Låt oss testa ovanstående mappningar i körd kod:
Körning av ovanstående kod skapar önskat schema i databasen och kör dessa SQL-förfrågningar.
Du kan verifiera data och mappningar i båda tabellerna när du kör ovanstående program.
Hibernate one to one mapping with common join table
Detta tillvägagångssätt är inte nytt för oss alla. Låt oss börja med målinriktad DB-struktur i den här tekniken.
I den här tekniken är den viktigaste annotationen som ska användas @JoinTable. Denna annotation används för att definiera det nya tabellnamnet (obligatoriskt) och främmande nycklar från båda tabellerna. Låt oss se hur den används:
@JoinTable-annotationen används i EmployeeEntity
-klassen. Den deklarerar att en ny tabell EMPLOYEE_ACCOUNT
kommer att skapas med två kolumner EMPLOYEE_ID
(primärnyckel i tabellen EMPLOYEE) och ACCOUNT_ID
(primärnyckel i tabellen ACCOUNT).
Testning av ovanstående enheter genererar följande SQL-frågor i loggfilerna:
Hibernate en till en mappning med delad primärnyckel
I den här tekniken ser hibernate till att använda ett gemensamt primärnyckelvärde i båda tabellerna. På så sätt kan primärnyckeln i EmployeeEntity
säkert antas vara primärnyckeln i AccountEntity
också.
Tabellstrukturen kommer att se ut så här:
I det här tillvägagångssättet är @PrimaryKeyJoinColumn den viktigaste annotationen som ska användas. Låt oss se hur man använder den.
@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;
I AccountEntity
kommer den att förbli beroende av ägarentiteten för mappningen.
@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;
Testning av ovanstående entiteter genererar följande SQL-frågor i loggfilerna:
Hibernate en till en mappning med @MapsId
I den här tekniken utgår hibernate från att både källan och målet har samma primärnyckelvärden.
I denna metod är @MapsId den viktigaste annotationen som ska användas. Låt oss se hur man använder den.
@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;
I AccountEntity
sida kommer den att förbli beroende av ägarentiteten för mappningen.
@Idprivate Integer accountId;
Testning av ovanstående entiteter genererar följande SQL-frågor i loggfilerna: