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ésAmint 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ó.