Articles

Hibernate one to Many Annotation Tutorial

introduktion

Denne hurtige Hibernate tutorial vil tage os gennem et eksempel på en en-til-mange kortlægning ved hjælp af JPA anmærkninger, et alternativ til HML.

Vi lærer også, hvad tovejsrelationer er, hvordan de kan skabe uoverensstemmelser, og hvordan ideen om ejerskab kan hjælpe.

yderligere læsning:

Spring Boot med Hibernate

en hurtig, praktisk introduktion til integration af Spring Boot og Hibernate / JPA.
læs mere på dansk

en oversigt over identifikatorer i Hibernate/JPA

Lær at kortlægge entitetsidentifikatorer med Hibernate.
læs mere

beskrivelse

kort sagt betyder en-til-mange kortlægning, at en række i en tabel er kortlagt til flere rækker i en anden tabel.

lad os se på følgende enhedsrelationsdiagram for at se en en-til-mange-tilknytning:

i dette eksempel implementerer vi et vognsystem, hvor vi har en tabel for hver vogn og en anden tabel for hver vare. En vogn kan have mange varer, så her har vi en en-til-mange kortlægning.

den måde, dette fungerer på databaseniveau, er, at vi har en cart_id som en primær nøgle i indkøbskurvtabellen og også en cart_id som en fremmed nøgle i varer.

den måde, vi gør det i kode er med @OneToMany.

lad os kortlægge Indkøbskurvklassen til Objektobjektet på en måde, der afspejler forholdet i databasen:

public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; //...}

Vi kan også tilføje en henvisning til indkøbskurv i varer ved hjælp af @ManyToOne, hvilket gør dette til et tovejsforhold. Tovejs betyder, at vi er i stand til at få adgang til varer fra vogne, og også vogne fra varer.

egenskaben mappedBy er det, vi bruger til at fortælle dvaletilstand, hvilken variabel vi bruger til at repræsentere forældreklassen i vores børneklasse.

følgende teknologier og biblioteker bruges til at udvikle en prøve Hibernate-applikation, der implementerer en-til-mange-tilknytning:

  • JDK 1.8 eller nyere
  • Maven 3 eller nyere
  • H2 database

Setup

3.1. Database Setup

nedenfor er vores database script til indkøbskurv og varer tabeller. Vi bruger den udenlandske nøglebegrænsning til en-til-mange kortlægning:

vores databaseopsætning er klar, så lad os gå videre til at oprette Dvaleeksempelprojektet.

3.2. Maven afhængigheder

Vi tilføjer derefter dvaletilstand og H2 driverafhængigheder til vores pom.fil. Den dvale afhængighed bruger JBoss logning, og det bliver automatisk tilføjet som transitive afhængigheder:

  • Hibernate version 5.2.7.Endelig
  • H2 driver version 1.4.197

besøg Maven central repository for de nyeste versioner af Hibernate og H2 afhængigheder.

3, 3. Hibernate Configuration

Her er konfigurationen af Hibernate:

3.4. HibernateAnnotationUtil klasse

med HibernateAnnotationUtil-klassen skal vi bare henvise til den nye Hibernate-konfigurationsfil:

modellerne

de kortlægningsrelaterede konfigurationer udføres ved hjælp af JPA-kommentarer i modelklasserne:

@Entity@Table(name="CART")public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; // getters and setters}

bemærk, at @OneToMany-annotationen bruges til at definere egenskaben i Elementklasse, der vil blive brugt til at kortlægge den kortlagte variabel. Derfor har vi en ejendom med navnet “cart” i Vareklassen:

det er også vigtigt at bemærke, at @ManyToOne-annotationen er knyttet til Cart class-variablen. @Joincolumn annotation refererer til den kortlagte kolonne.

i aktion

i testprogrammet opretter vi en klasse med en hovedmetode() til at få dvaletilstand og gemme modelobjekterne i databasen, der implementerer en-til-mange-foreningen:

Dette er output fra vores testprogram:

@ManyToOne-annotationen

som vi har set i Afsnit 2, kan vi specificere en mange-til-en-forhold ved hjælp af @manytoone-annotationen. En mange – til-en-kortlægning betyder, at mange forekomster af denne enhed er kortlagt til en forekomst af en anden enhed-mange elementer i en kurv.

@ManyToOne-annotationen giver os også mulighed for at oprette tovejsrelationer. Vi dækker dette detaljeret i de næste par underafsnit.

6. 1. Uoverensstemmelser og ejerskab

nu, hvis Cart refererede varer, men varer ikke igen refererede til Cart, ville vores forhold være ensrettet. Objekterne ville også have en naturlig konsistens.

i vores tilfælde er forholdet dog tovejs, hvilket giver mulighed for inkonsekvens.

lad os forestille os en situation, hvor en udvikler ønsker at tilføje item1 til indkøbskurv og item2 til cart2, men laver en fejl, så referencerne mellem cart2 og item2 bliver inkonsekvente:

som vist ovenfor refererer item2 cart2, mens cart2 ikke henviser til item2, og det er dårligt.

hvordan skal Hibernate gemme item2 til databasen? Vil item2 fremmed nøgle reference cart1 eller cart2?

Vi løser denne tvetydighed ved hjælp af ideen om en ejende side af forholdet; referencer, der tilhører den ejende side, har forrang og gemmes i databasen.

6. 2. Elementer som Ejersiden

som angivet i JPA-specifikationen under afsnit 2.9, Er det en god praksis at markere mange til en side som ejersiden.

med andre ord ville varer være den ejende side og vogn den inverse side, hvilket er præcis, hvad vi gjorde tidligere.

så hvordan har vi opnået dette?

Ved at inkludere attributten mappedBy i Cart-klassen markerer vi den som den omvendte side.

samtidig kommenterer vi også emnerne.vognfelt med @ManyToOne, hvilket gør genstande til den ejende side.

Når vi går tilbage til vores “inkonsekvens” – eksempel, ved Hibernate nu, at item2 ‘s reference er vigtigere og gemmer item2’ s reference til databasen.

lad os kontrollere resultatet:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=2

selvom cart referencer item2 i vores uddrag, er item2s reference til cart2 gemt i databasen.

6, 3. Vogn som ejer Side

det er også muligt at markere en-til-mange side som ejer side, og mange-til-en side som den inverse side.

selvom dette ikke er en anbefalet praksis, lad os gå videre og prøve det.

kodestykket nedenfor viser implementeringen af en-til-mange side som den ejende side:

bemærk, hvordan vi fjernede mappedBy-elementet og satte mange-til-en @JoinColumn som indsættelig og opdaterbar til falsk.

Hvis vi kører den samme kode, vil resultatet være det modsatte:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=1

som vist ovenfor, nu item2 tilhører cart.

konklusion

Vi har set, hvor let det er at implementere en-til-mange-forholdet til dvaletilstand ORM og H2-databasen ved hjælp af JPA-kommentarer.

derudover lærte vi om tovejsrelationer og hvordan man implementerer forestillingen om en ejende side.