Állandó térképek hibernált állapotban

1. Bemutatkozás

A hibernált állapotban egy-a-sokhoz viszonyokat képviselhetünk Java-babjainkban, ha az egyik mezőnk a Lista.

Ebben a gyors bemutatóban megvizsgáljuk ennek a Térkép helyette.

2. Térképs különböznek a Listas

Használva Térkép az egy a sokhoz viszony képviselete különbözik az a-tól Lista mert van kulcsunk.

Ez a kulcs entitáskapcsolatunkat a hármas asszociáció, ahol minden kulcs egyszerű értékre, beágyazható objektumra vagy entitásra utal. Emiatt a Térkép, mindig szükségünk lesz csatlakozási tábla az idegen entitás - a kulcs és az érték - hivatkozására szolgáló idegen kulcs tárolására.

De ez a csatlakozási asztal kicsit különbözik a többi csatlakozási táblától az elsődleges kulcs nem feltétlenül idegen kulcs a szülő és a cél számára. Ehelyett az elsődleges kulcs a szülő idegen kulcsának és egy oszlopnak az összetétele lesz Térkép.

A kulcs-érték pár a Térkép kétféle lehet: Értéktípus és Entitás típus. A következő szakaszokban megvizsgáljuk, hogyan lehet ezeket az egyesületeket Hibernate-ben képviselni.

3. Használata @MapKeyColumn

Tegyük fel, hogy van egy Rendelés entitást, és szeretnénk nyomon követni a megrendelésben szereplő összes tétel nevét és árát. Így, szeretnénk bevezetni a Térkép nak nek Rendelés amely feltünteti az árucikk nevét az árára:

@Entity @Table (name = "rendelések") public class Rendelés {@Id @GeneratedValue @Column (name = "id") private int id; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referentedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "price") private Térkép elemPriceMap; // szabványos mérőeszközök és beállítók}

Meg kell jelölnünk a hibernálás előtt, honnan szerezzük be a kulcsot és az értéket. A kulcshoz @ -ot használtunkMapKeyOszlop, jelezve, hogy a Térkép’Kulcsa az termék név csatlakozási táblázat oszlop, order_item_mapping. Hasonlóképpen, @Oszlop meghatározza, hogy a Térképek értéke megfelel a ár oszlop a csatlakozási táblázat.

Is, itemPriceMap objektum egy értéktípusú térkép, ezért a @ElementCollection annotáció.

Az alapérték típusú objektumok mellett a @Beágyazható objektumok is használhatók TérképÉrtékeit hasonló módon.

4. Használata @MapKey

Mint mindannyian tudjuk, a követelmények az idő múlásával változnak - tegyük fel, hogy most tegyük fel még néhány tulajdonságát Tétel együtt termék név és darab ár:

@Entity @Table (name = "item") public class Item {@Id @GeneratedValue @Column (name = "id") private int id; @ Oszlop (név = "név") privát karakterlánc elemNév; @ Oszlop (név = "ár") privát dupla elemÁra; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") private Dátum létrehozásának dátuma; // szabványos mérőeszközök és beállítók}

Ennek megfelelően változtassunk Térkép nak nek Térkép ban,-ben Rendelés entitásosztály:

@Entity @Table (name = "megrendelések") public class Rendelés {@Id @GeneratedValue @Column (name = "id") private int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referentedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item_id", referiatedColumnName = "id")}) @MapKey (name = "itemName") privát Map itemMap; }

Ne feledje, hogy ezúttal a @MapKey megjegyzés, hogy a hibernált használja Tétel#termék név a térképkulcs oszlopként, ahelyett, hogy további oszlopot vezetne be a csatlakozási táblába. Tehát ebben az esetben a csatlakozási asztal order_item_mappingnincs kulcsoszlopa - ehelyett a éntem’Neve.

Ez ellentétben áll a @MapKeyColumn. Mikor használunk @MapKeyColumn, a térképkulcs a csatlakozási táblázatban található. Ez az oka annak nem definiálhatjuk az entitás-hozzárendelésünket mindkét felirat együttes használatával.

Is, itemMap egy entitástípus-térkép, ezért a kapcsolatot a -val kell annotálnunk @Egy a sokhoz vagy @ManyToMany.

5. Használata @MapKeyEnumerated és @MapKeyTemporal

Valahányszor enumot jelölünk meg Térkép kulcs, használjuk @MapKeyEnumerated. Hasonlóképpen, az időbeli értékek esetében @MapKeyTemporal használt. A viselkedés meglehetősen hasonló a szokásoshoz @ Számlálva és @Időbeli annotációk, ill.

Alapértelmezés szerint ezek hasonlóak a @MapKeyColumn abban egy kulcsoszlop jön létre a csatlakozási táblában. Ha újra akarjuk használni a fennmaradó entitásban már tárolt értéket, akkor a mezőt kiegészítőleg meg kell jelölnünk @MapKey.

6. Használata @MapKeyJoinColumn

Ezután tegyük fel, hogy nyomon kell követnünk az egyes termékek eladóit is. Ennek egyik módja az a hozzáadása Eladó entitás és kösd ezt a miénkhez Tétel entitás:

@Entity @Table (name = "eladó") public class Seller {@Id @GeneratedValue @Column (name = "id") private int id; @ Oszlop (név = "név") privát karakterlánc eladóNév; // szabványos mérőeszközök és beállítók}
@Entity @Table (name = "item") public class Item {@Id @GeneratedValue @Column (name = "id") private int id; @ Oszlop (név = "név") privát karakterlánc elemNév; @ Oszlop (név = "ár") privát dupla elemÁra; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") private Dátum létrehozásának dátuma; @ManyToOne (kaszkád = CascadeType.ALL) @JoinColumn (név = "eladó_azonosító") privát eladó eladó; // szabványos mérőeszközök és beállítók}

Ebben az esetben tegyük fel, hogy felhasználási esetünk az összes csoportosítása Rendelés’S Tétels által Eladó. Ezért változzunk Térkép nak nek Térkép:

@Entity @Table (name = "megrendelések") public class Rendelés {@Id @GeneratedValue @Column (name = "id") private int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referentedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item_id", referentedColumnName = "id")}) @MapKeyJoinColumn (név = "eladó_azonosító") privát Térkép eladóItemMap; // szabványos mérőeszközök és beállítók}

Hozzá kell tennünk @MapKeyJoinColumn ennek elérése érdekében, mivel ez az annotáció lehetővé teszi a Hibernate számára az eladó_id oszlop (a térképkulcs) a csatlakozási táblázatban order_item_mapping együtt a tárgy azonosító oszlop. Tehát akkor, az adatok adatbázisból történő kiolvasásakor elvégezhetjük a CSOPORTOSÍT könnyen kezelhető.

7. Következtetés

Ebben a cikkben megismertük a kitartás számos módját Térkép hibernált állapotban, a szükséges térképezéstől függően.

Mint mindig, az oktatóanyag forráskódja a Github felett található.


$config[zx-auto] not found$config[zx-overlay] not found