Articles

Hibernate One to Many Annotation Tutorial

Introduction

Tämä nopea Hibernate tutorial vie meidät läpi esimerkin yhdestä moneen-kartoituksesta JPA-merkintöjen avulla, vaihtoehtona XML: lle.

opimme myös, mitä kaksisuuntaiset suhteet ovat, miten ne voivat luoda epäjohdonmukaisuuksia ja miten ajatus omistamisesta voi auttaa.

lisätietoja:

Spring Boot with Hibernate

nopea, käytännöllinen intro jousikäynnistyksen ja Hibernate / JPA: n yhdistämiseen.
Lue lisää →

yleiskatsaus tunnisteista Hibernate/JPA

Opi kartoittamaan entiteettitunnisteita Hibernaten avulla.
Lue lisää →

kuvaus

yksinkertaisesti sanottuna yhdestä moneen-kartoitus tarkoittaa, että yksi rivi taulukossa on yhdistetty useaksi riviksi toisessa taulukossa.

katsotaan seuraavasta entiteettisuhdekaaviosta yksi yhteen-assosiaatio:

tässä esimerkissä toteutetaan korijärjestelmä, jossa jokaiselle korille on taulukko ja jokaiselle tavaralle toinen taulukko. Yhdessä kärryssä voi olla monta kohdetta, joten tässä meillä on yksi-monta kartoitus.

tämä toimii tietokantatasolla siten, että meillä on cart_id ensisijaisena avaimena cart-taulukossa ja myös cart_id ulkomaisena avaimena kohteissa.

tapa tehdä se koodilla on @OneToMany.

kartoitetaan cart-Luokka kohteille tavalla, joka kuvastaa suhdetta tietokannassa:

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

voimme lisätä myös viittauksen koriin kohteissa @ManyToOne, jolloin tämä on kaksisuuntainen suhde. Kaksisuuntainen tarkoittaa, että voimme käyttää kohteita kärryt, ja myös kärryt kohteita.

mappedBy-ominaisuus kertoo Hibernatelle, mitä muuttujaa käytämme edustamaan lapsiluokkamme vanhempainluokkaa.

seuraavia teknologioita ja kirjastoja käytetään, jotta voidaan kehittää näyte-Hibernate-sovellus, joka toteuttaa yhdestä moneen-assosiaation:

  • JDK 1.8 tai uudempi
  • Hibernate 5
  • Maven 3 tai uudempi
  • H2-tietokanta

Setup

3.1. Tietokannan asetukset

alla on Tietokantasarjamme Cart-ja Itemtaulukoille. Käytämme foreign key-rajoitusta yhdestä moneen-kartoitukseen:

tietokantamme asetukset ovat valmiina, joten siirrytään Hibernate-esimerkkiprojektin luomiseen.

3, 2. Maven-riippuvuudet

lisäämme sitten Hibernate-ja H2-ohjainriippuvuudet pom-järjestelmäämme.xml-tiedosto. Hibernate-riippuvuus käyttää JBoss-kirjausta, ja se lisätään automaattisesti transitiivisena riippuvuutena:

  • Hibernate-versio 5.2.7.Lopullinen
  • H2-ohjainversio 1.4.197

käy Mavenin keskustietokannassa hakemassa Hibernaten ja H2-riippuvuuksien uusimmat versiot.

3, 3. Hibernaten kokoonpano

tässä on Hibernaten kokoonpano:

3.4. HibernateAnnotationUtil-Luokka

HibernateAnnotationUtil-luokan kanssa tarvitsee vain viitata uuteen Hibernate-asetustiedostoon:

mallit

kartoitukseen liittyvät kokoonpanot tehdään MALLILUOKKIEN yhteisen edustajakokouksen huomautuksilla:

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

Huomioithan, että @OneToMany-merkintää käytetään määrittelemään muuttujien luokan ominaisuus, jota käytetään mapped by-muuttujan kartoittamiseen. Siksi kohteissa on ominaisuus nimeltä ”cart”:

on myös tärkeää huomata, että @ManyToOne-merkintä liittyy Cart-luokkamuuttujaan. @JoinColumn annotation viittaa kartoitettuun sarakkeeseen.

toiminnassa

testiohjelmassa luomme luokan, jossa on päämenetelmä() Hibernate-istunnon saamiseksi ja malliobjektien tallentaminen tietokantaan, joka toteuttaa one-to-many-assosiaation:

Tämä on testiohjelmamme tuotos:

@ManyToOne-Huomautus

kuten olemme nähneet jaksossa 2, voimme määritä monta yhteen-suhde käyttämällä @manytoone-merkintää. Monesta yhteen-kartoitus tarkoittaa sitä, että monet tämän kokonaisuuden ilmentymät on kartoitettu yhden toisen kokonaisuuden ilmentymäksi – monta kohdetta yhdessä ostoskorissa.

@ManyToOne-merkinnällä voidaan luoda myös kaksisuuntaisia suhteita. Käsittelemme tätä yksityiskohtaisesti seuraavissa kohdissa.

6, 1. Epäjohdonmukaisuudet ja omistus

nyt, jos ostoskorissa viitattaisiin eriin, mutta erät eivät vuorollaan viitekärryihin, suhteemme olisi yksisuuntainen. Esineillä olisi myös luonnollinen johdonmukaisuus.

meidän tapauksessamme suhde on kuitenkin kaksisuuntainen, mikä tuo epäjohdonmukaisuuden mahdollisuuden.

kuvitellaan tilanne, jossa kehittäjä haluaa lisätä item1: n ostoskoriin ja item2: n cart2: een, mutta tekee virheen niin, että viittaukset cart2: n ja item2: n välillä muuttuvat epäjohdonmukaisiksi:

kuten yllä on esitetty, item2 viittaa cart2: een, kun taas cart2 ei viittaa item2: een, ja se on huono asia.

miten Hibernaten pitäisi tallentaa item2 tietokantaan? Onko erem2 ulkomainen avainviite cart1 vai cart2?

ratkaisemme tämän epäselvyyden käyttämällä ajatusta omistavasta suhteesta; omistavalle puolelle kuuluvat viittaukset ovat etusijalla ja tallennetaan tietokantaan.

6, 2. Erät omistavana osapuolena

kuten yhteisen parlamentaarisen edustajakokouksen eritelmässä 2.9 kohdassa todetaan, on hyvä käytäntö merkitä monelta toiselle omistava puoli.

toisin sanoen kohteet olisivat omistava puoli ja kärryt käänteispuoli, mikä on juuri se, mitä teimme aiemmin.

Joten miten saavutimme tämän?

sisällyttämällä mappedBy-attribuutin Cart-luokkaan merkitään se käänteispuoleksi.

samalla merkitään myös kohteita.cart field with @ManyToOne, making Items the owning side.

Palatakseni ”epäjohdonmukaisuuteen”, nyt Hibernate tietää, että item2: n viittaus on tärkeämpi ja tallentaa item2: n viittauksen tietokantaan.

tarkistetaan tulos:

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

vaikka cart viittaakin pätkässämme item2: een, item2: n viittaus cart2: een on tallennettu tietokantaan.

6, 3. Cart Omistavana puolena

on myös mahdollista merkitä yksi-yhteen-puoli omistavaksi puoleksi ja monta-yhteen-puoli käänteispuoleksi.

vaikka tämä ei ole suositeltava käytäntö, mennään eteenpäin ja kokeillaan sitä.

alla oleva koodinpätkä näyttää one-to-many-puolen toteutuksen omistavana puolena:

huomaa, miten poistimme mappedBy-elementin ja asetimme monesta yhteen @JoinColumn-elementin lisättäväksi ja päivitettäväksi false-muotoon.

jos ajetaan sama koodi, tulos on päinvastainen:

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

kuten yllä on esitetty, nyt item2 kuuluu cart: iin.

johtopäätös

olemme nähneet, kuinka helppoa on toteuttaa yksi-monta-suhde Hibernate ORM-ja H2-tietokantaan yhteisen parlamentaarisen edustajakokouksen huomautusten avulla.

lisäksi opimme kaksisuuntaisista suhteista ja omistavan puolen käsitteen toteuttamisesta.