Articles

Hibernate One to Many Annotation Tutorial

Introduction

Ez a gyors hibernált bemutató egy példát mutat be egy-sok leképezés segítségével JPA kommentárok, alternatívája az XML.

azt is megtudjuk, hogy milyen kétirányú kapcsolatok vannak, hogyan hozhatnak létre ellentmondásokat, és hogyan segíthet a tulajdonjog gondolata.

További olvasmány:

tavaszi csomagtartó Hibernate

gyors, gyakorlati bevezetés a tavaszi csomagtartó és a Hibernate / JPA integrálásához.
tovább →

A Hibernate/JPA

azonosítók áttekintése a Hibernate / JPA

megtanulják, hogyan kell feltérképezni az entitásazonosítókat hibernált állapotban.
tovább →

leírás

egyszerűen fogalmazva, az egy-sok leképezés azt jelenti, hogy a táblázat egyik sora egy másik táblázat több sorára van leképezve.

nézzük a következő egység a kapcsolat diagram látni egy-sok egyesület:

ebben A példában, majd végre egy kocsi rendszer, ahol van egy táblázat minden olyan kocsit, valamint egy másik táblázatban az egyes elemek. Egy kosárban sok elem lehet, tehát itt van egy egy-sok leképezés.

az adatbázis szintjén ez úgy működik, hogy van egy cart_id, mint elsődleges kulcs a kosárasztalban, valamint egy cart_id, mint idegen kulcs az elemekben.

a kódolás módja a @OneToMany.

térképezzük fel a Kosárosztályt az elemek objektumra oly módon, hogy tükrözze az adatbázisban lévő kapcsolatot:

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

a @ManyToOne használatával is hivatkozhatunk a kosárra, így ez kétirányú kapcsolat. A kétirányú azt jelenti, hogy képesek vagyunk hozzáférni a kocsikból származó tárgyakhoz, valamint az elemekből származó kocsikhoz.

a mappedBy tulajdonság az, amit arra használunk, hogy elmondjuk Hibernate melyik változót használjuk a szülői osztály képviseletére gyermekosztályunkban.

a következő technológiákat és könyvtárakat használják egy minta hibernált alkalmazás kifejlesztéséhez, amely egy-sok társítást valósít meg:

  • JDK 1.8 vagy újabb
  • Hibernate 5
  • Maven 3 vagy újabb
  • H2 adatbázis

Setup

3.1. Adatbázis-beállítás

Az alábbiakban a kosár és az elemek táblázatokhoz tartozó adatbázis-szkriptünk található. Az idegen kulcskorlátozást egy-sok leképezéshez használjuk:

adatbázis-beállításunk készen áll, ezért lépjünk tovább a Hibernate példaprojekt létrehozásához.

3.2. Maven függőségek

ezután hozzáadjuk a hibernált és H2 driver függőségeket a pom-hoz.xml fájl. A hibernált függőség JBoss naplózást használ, és automatikusan átmeneti függőségként kerül hozzáadásra:

  • Hibernate 5.2.7 verzió.Végleges
  • H2 illesztőprogram 1.4-es verziója.197

kérjük, látogasson el a Maven központi tárolójába a Hibernate és a H2 függőségek legújabb verzióihoz.

3, 3. Hibernate Configuration

itt található a Hibernate konfigurációja:

3.4. HibernateAnnotationUtil osztály

a HibernateAnnotationUtil osztály, csak meg kell hivatkozni az új Hibernate konfigurációs fájl:

A modellek

a leképezés kapcsolódó konfigurációk segítségével történik JPA kommentárok a modell osztályok:

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

kérjük, vegye figyelembe, hogy a @OneToMany megjegyzés a tulajdonság meghatározására szolgál az Items osztályban, amelyet a mappedBy változó feltérképezésére használnak. Ezért van egy “cart” nevű tulajdonságunk az elemek osztályban:

fontos megjegyezni, hogy a @ManyToOne annotáció a Cart class változóhoz van társítva. @JoinColumn annotáció hivatkozik a leképezett oszlopra.

Akció

a vizsgálati program létrehozunk egy osztályba, egy main() metódus, hogy a Hibernálás Ülésen, majd mentse a modell objektumok az adatbázisba, végrehajtási, hogy az egy-a-sok egyesület:

Ez a kimenet a teszt program:

A @ManyToOne Jegyzet

Mint láttuk, 2. szakasz, megadhatunk egy sok-az-egyhez kapcsolat segítségével @ManyToOne jegyzet. A many-to-one leképezés azt jelenti, hogy ennek az entitásnak sok példánya egy másik entitás egyik példányára van leképezve – sok elem egy kosárban.

a @ManyToOne kommentár segítségével kétirányú kapcsolatokat is létrehozhatunk. Ezt részletesen tárgyaljuk a következő néhány alszakaszban.

6.1. Következetlenségek és tulajdonosi

most, ha a KOSÁR hivatkozott elemeket, de tételek nem viszont referencia kosár, a kapcsolat lenne egyirányú. A tárgyak természetes konzisztenciájúak is lennének.

esetünkben azonban a kapcsolat kétirányú, ami az inkonzisztencia lehetőségét eredményezi.

képzeljünk el egy olyan helyzetet, ahol a fejlesztő szeretné, hogy adjunk item1 a kosárba, majd item2, hogy cart2, de hibázik, így a hivatkozások között cart2, valamint item2 egyenetlen lesz:

Mint látható, a fenti item2 hivatkozások cart2, mivel cart2 nem referencia item2, ez pedig rossz.

hogyan kell hibernálni menteni item2 az adatbázisba? Item2 külföldi kulcs referencia cart1 vagy cart2?

ezt a kétértelműséget a kapcsolat birtokló oldalának gondolatával oldjuk meg; a birtokló oldalhoz tartozó hivatkozások elsőbbséget élveznek, és az adatbázisba kerülnek.

6, 2. Tételek, mint a birtokló oldal

amint azt a JPA specifikáció a 2.9. szakasz, Ez egy jó gyakorlat, hogy jelölje meg a sok-az egyik oldalon, mint a birtokló oldalon.

más szóval, az elemek a birtokló oldal, a kocsi pedig az inverz oldal, ami pontosan az, amit korábban tettünk.

tehát hogyan sikerült ezt elérni?

a Mappedby attribútumnak a Kosárosztályba való beillesztésével inverz oldalként jelöljük meg.

ugyanakkor kommentáljuk az elemeket is.kosár mező @ManyToOne, így elemek a birtokló oldalon.

visszatérve az “inkonzisztencia” példánkhoz, most Hibernate tudja, hogy az item2 hivatkozása fontosabb, és megmenti az item2 hivatkozását az adatbázisra.

ellenőrizzük az eredményt:

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

bár a KOSÁR a részletekben az item2-re hivatkozik, az item2 a cart2-re való hivatkozása az adatbázisba kerül.

6, 3. Cart mint a birtokló oldalon

az is lehetséges, hogy jelölje meg az egy-a-sok oldalon, mint a birtokló oldalon, és sok-az-egyik oldalon, mint az inverz oldalon.

bár ez nem ajánlott gyakorlat, próbáljuk meg.

az alábbi kódrészlet az egy-sok oldal birtokló oldalként történő megvalósítását mutatja:

figyeljük meg, hogyan távolítottuk el a mappedBy elemet, és állítsuk be a sok-egy @JoinColumn-t beilleszthető és frissíthető false-ra.

Ha ugyanazt a kódot futtatjuk, az eredmény ellentétes lesz:

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

a fentiek szerint az item2 a kosárhoz tartozik.

következtetés

láttuk, hogy milyen egyszerű a Hibernate ORM és H2 adatbázissal való egy-egy kapcsolat megvalósítása JPA kommentárok segítségével.

továbbá megismertük a kétirányú kapcsolatokat, valamint azt, hogy hogyan valósítsuk meg a birtokló oldal fogalmát.