Hibernálás egy-sok kommentár bemutató

1. Bemutatkozás

Ez a gyors hibernált oktatóanyag bemutat egy példát a egy a sokhoz leképezés JPA annotációkkal, az XML alternatívája.

Megtudjuk azt is, hogy mik a kétirányú kapcsolatok, hogyan tudnak ellentmondásokat létrehozni, és hogyan segíthet a tulajdonosi gondolat.

2. Leírás

Egyszerűen fogalmazva,egy a sokhoz a leképezés azt jelenti, hogy egy táblázat egyik sora egy másik táblázat több sorához van hozzárendelve.

Nézzük meg a következő entitáskapcsolati diagramot a egy a sokhoz Egyesület:

Ebben a példában egy kosárrendszert valósítunk meg, ahol minden kosárhoz van egy táblázat, és minden cikkhez egy másik táblázat. Egy kocsi sok elemet tartalmazhat, tehát itt van egy egy a sokhoz feltérképezése.

Ahogy ez adatbázis szinten működik, az a cart_id elsődleges kulcsként a szekér táblázat és a cart_id mint idegen kulcs in elemeket.

A kóddal történő végrehajtás módja @Egy a sokhoz.

Feltérképezzük a Kosár osztály a Tételek objektum oly módon, hogy az tükrözze az összefüggést az adatbázisban:

public class Kosár {// ... @OneToMany (mappedBy = "cart") privát készlet tételek; // ...}

Adhatunk hozzá hivatkozást is Kosár ban ben Tételek felhasználásával @ManyToOne, így ez kétirányú kapcsolat. A kétirányú azt jelenti képesek vagyunk hozzáférni elemeket tól től szekerek, és még szekerek tól től elemeket.

A feltérképezve tulajdonság az, amellyel elmondjuk a hibernálásnak, hogy melyik változót használjuk a szülő osztály képviseletére gyermekosztályunkban.

A következő technológiákat és könyvtárakat használjuk a Hibernate minta megvalósításához egy a sokhoz Egyesület:

  • JDK 1.8 vagy újabb
  • Hibernálás 5
  • Maven 3 vagy újabb
  • H2 adatbázis

3. Beállítás

3.1. Adatbázis beállítása

Az alábbiakban az adatbázis-szkriptünk található Kosár és Tételek táblázatok. Az idegen kulcsra vonatkozó kényszert használjuk egy a sokhoz feltérképezés:

CREATE TABLE `Kosár` (` cart_id` int (11) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`cart_id`)) ENGINE = InnoDB AUTO_INCREMENT = 5 DEFAULT CHARSET = utf8; CREATE TABLE `Items '(` id` int (11) unsigned NOT NULL AUTO_INCREMENT, `cart_id` int (11) unsigned NOT NULL, PRIMARY KEY (` id'), KEY `cart_id` (` cart_id`), CONSTRAINT `items_ibfk_1 `FOREIGN KEY (` cart_id`) HIVATKOZÁSOK `Cart` (` cart_id`)) MOTOR = InnoDB AUTO_INCREMENT = 7 ALAPÍTVÁNY = utf8;

Az adatbázisunk készen áll, ezért térjünk át a Hibernate példa projekt létrehozására.

3.2. Maven-függőségek

Ezután hozzáadjuk a hibernált és a H2 illesztőprogram-függőséget pom.xml fájl. A hibernált függőség JBoss naplózást használ, és automatikusan hozzáadódik tranzitív függőségként:

  • Hibernált verzió 5.2.7.Végső
  • H2 illesztőprogram 1. verziója.4.197

Kérjük, keresse fel a Maven központi adattárát a Hibernate és a H2 függőségek legújabb verzióinak megtekintéséhez.

3.3. Hibernált konfiguráció

Itt van a Hibernate konfigurációja:

  org.h2.Driver jdbc: h2: mem: spring_hibernate_one_to_many sa org.hibernate.dialect.H2Dialect thread true 

3.4. HibernateAnnotationUtil Osztály

A ... val HibernateAnnotationUtil osztályban, csak hivatkoznunk kell az új hibernált konfigurációs fájlra:

privát statikus SessionFactory sessionFactory; privát SessionFactory buildSessionFactory () {ServiceRegistry serviceRegistry = új StandardServiceRegistryBuilder (). configure ("hibernate-annotation.cfg.xml"). build (); Metadata metadata = új MetadataSources (serviceRegistry) .getMetadataBuilder (). Build (); SessionFactory sessionFactory = metadata.getSessionFactoryBuilder (). Build (); return sessionFactory; } public SessionFactory getSessionFactory () {if (sessionFactory == null) sessionFactory = buildSessionFactory (); return sessionFactory; }

4. A modellek

A leképezéssel kapcsolatos konfigurációkat a JPA annotációkkal hajtják végre a modellosztályokban:

@Entity @Table (name = "CART") public class Kosár {// ... @OneToMany (mappedBy = "cart") private Set items; // szerelők és beállítók}

Felhívjuk figyelmét, hogy a @Egy a sokhoz annotációval lehet meghatározni a tulajdonságot Tételek osztály, amelyet a feltérképezve változó. Ezért van egy ingatlanunk,szekér" ban,-ben Tételek osztály:

@Entity @Table (name = "ITEMS") public class Items {// ... @ManyToOne @JoinColumn (name = "cart_id", nullable = false) private Kosár kosár; nyilvános elemek () {} // getters and setters} 

Fontos megjegyezni azt is, hogy a @ManyToOne kommentár társul a Kosár osztály változó. @JoinColumn annotáció hivatkozik a leképezett oszlopra.

5. Műveletben

A tesztprogramban létrehozunk egy osztályt a-val fő-() metódus a hibernált munkamenet megszerzéséhez, és a modellobjektumok mentése a egy a sokhoz Egyesület:

sessionFactory = HibernateAnnotationUtil.getSessionFactory (); session = sessionFactory.getCurrentSession (); System.out.println ("Munkamenet létrehozva"); tx = session.beginTransaction (); session.save (szekér); session.save (item1); session.save (item2); tx.commit (); System.out.println ("Cartitem1, Foreign Key Cartitem2, Foreign Key Cartmany-to-one">6. A @ManyToOne Megjegyzés

Amint a 2. szakaszban láthattuk, megadhatjuk a sok-az-egyhez kapcsolat használatával @ManyToOne annotáció. A sok-az-egyhez a leképezés azt jelenti, hogy ennek az entitásnak számos példányát hozzárendelik egy másik entitás egyik példányához - sok tétel egy kosárban.

A @ManyToOne az annotáció segítségével kétirányú kapcsolatokat is létrehozhatunk. Erről a következő néhány szakaszban részletesen foglalkozunk.

6.1. Következetlenségek és tulajdonjog

Most ha Kosár hivatkozva Tételek, de Tételek viszont nem utalt Kosár, a kapcsolatunk egyirányú lenne. A tárgyak természetes konzisztenciájúak is lennének.

Esetünkben azonban a kapcsolat kétirányú, a következetlenség lehetőségének bevezetése.

Képzeljünk el egy olyan helyzetet, amikor egy fejlesztő hozzá kíván tenni tétel1 nak nek szekér és tétel2 nak nek szekér2, de hibát követ el, így a hivatkozások között szekér2 és tétel2 következetlenné válnak:

Kosárkocsi1 = új Kosár (); Kosárkocsi2 = új Kosár (); Elemek elem1 = új elemek (cart1); Tételek item2 = új elemek (cart2); Set itemsSet = új HashSet (); itemsSet.add (item1); itemsSet.add (item2); cart1.setItems (itemsSet); // rossz!

A fentiek szerint tétel2 hivatkozások cart2, mivel szekér2 nem hivatkozik 2. tétel, és ez rossz.

Hogyan kell a hibernáltnak spórolni tétel2 az adatbázisba? Akarat tétel2 idegen kulcs hivatkozás szekér1 vagy szekér2?

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

6.2. Tételek mint a Tulajdonos oldal

Amint azt a Közös Parlamenti Közgyűlés specifikációjának 2.9. Szakasza jó gyakorlat megjelölni sok-az-egyhez oldalon, mint a tulajdonos oldalon.

Más szavakkal, éntemek lenne a tulajdonosa és Kosár a fordított oldala, amit pontosan mi tettünk korábban.

Tehát hogyan értük el ezt?

A feltérképezve attribútum a Kosár osztály, fordított oldalaként jelöljük.

Ugyanakkor feljegyezzük a Tételek.szekér mezővel @ManyToOne, készítése Tételek a tulajdonos oldal.

Visszatérve a „következetlenség” példánkra, most a Hibernate tudja, hogy a tétel2Referenciája fontosabb és megment tétel2Hivatkozás az adatbázisra.

Ellenőrizzük az eredményt:

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

Habár szekér hivatkozások tétel2 részletünkben, tétel2’Hivatkozása szekér2 az adatbázisba kerül.

6.3. Kosár mint a Tulajdonos oldal

Lehetőség van a egy a sokhoz oldal, mint tulajdonos oldal, és sok-az-egyhez oldala, mint fordított oldala.

Bár ez nem ajánlott gyakorlat, folytassuk és próbáljuk ki.

Az alábbi kódrészlet bemutatja a egy a sokhoz mint tulajdonos oldal:

public class ItemsOIO {// ... @ManyToOne @JoinColumn (név = "cart_id", behelyezhető = hamis, frissíthető = hamis) privát CartOIO kosár; // ..} public class CartOIO {// .. @OneToMany @JoinColumn (name = "cart_id") // meg kell másolnunk a fizikai információkat private Set elemek; // ..} 

Figyelje meg, hogyan távolítottuk el a feltérképezve elemet, és állítsa be a sok-az-egyhez @JoinColumn mint behelyezhető és frissíthető nak nek hamis.

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

item1 ID = 1, Foreign Key Kosár ID = 1 item2 ID = 2, Foreign Key Kosár ID = 1

Ahogy fentebb bemutattuk, most tétel2 tartozik valamihez szekér.

7. Következtetés

Láttuk, milyen egyszerű megvalósítani a egy a sokhoz kapcsolat a Hibernate ORM és H2 adatbázissal JPA kommentárok használatával.

Ezenkívül megismertük a kétirányú kapcsolatokat és a tulajdonosi oldal fogalmának megvalósítását.

A cikk forráskódja a GitHub oldalon található.