Trvalé mapy s režimom dlhodobého spánku

1. Úvod

V režime dlhodobého spánku môžeme v našich fazuľach Java reprezentovať vzťahy typu jedna k mnohým tak, že jedno z našich polí bude a Zoznam.

V tomto rýchlom výučbe preskúmame rôzne spôsoby, ako to dosiahnuť pomocou a Mapa namiesto toho.

2. Mapas Líšia sa od Zoznams

Pomocou a Mapa reprezentovať vzťah jeden na viacerých sa líši od a Zoznam pretože máme kľúč.

Tento kľúč premieňa náš vzťah entity na a ternárny asociácia, kde každý kľúč odkazuje na jednoduchú hodnotu alebo na vložiteľný objekt alebo entitu. Z tohto dôvodu používať a Mapa, budeme vždy potrebovať tabuľka spojení na uloženie cudzieho kľúča, ktorý odkazuje na nadradenú entitu - kľúč a hodnotu.

Ale táto spojovacia tabuľka sa v tom bude trochu líšiť od ostatných spojovacích tabuliek primárny kľúč nemusí byť nevyhnutne cudzí kľúč pre rodiča a cieľ. Namiesto toho budeme mať primárny kľúč zložený z cudzieho kľúča pre nadradeného prvku a stĺpca, ktorý je kľúčom k nášmu Mapa.

Pár kľúč - hodnota v Mapa môžu byť dva typy: Typ hodnoty a Typ entity. V nasledujúcich častiach sa pozrieme na spôsoby, ako reprezentovať tieto asociácie v režime dlhodobého spánku.

3. Používanie @MapKeyColumn

Povedzme, že máme objednať entita a chceme sledovať názov a cenu všetkých položiek v objednávke. Takže chceme zaviesť a Mapa do objednať ktorý namapuje názov položky na jej cenu:

@Entity @Table (name = "objednávky") verejná trieda Order {@Id @GeneratedValue @Column (name = "id") private int id; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "price") private Položka na mapePriceMap; // štandardné getre a setre}

Musíme naznačiť do režimu dlhodobého spánku, kde získať kľúč a hodnotu. Pre kľúč, použili sme @MapKeyStĺpec, čo naznačuje, že MapaKľúčom je názov položky stĺpec našej spojovacej tabuľky, mapovanie_objednávky_objednávky. Podobne @ Stĺpec upresňuje, že Mapy hodnota zodpovedá cena stĺpec tabuľky spojenia.

Tiež itemPriceMap objekt je mapa hodnotového typu, takže musíme použiť @ElementCollection anotácia.

Okrem objektov základnej hodnoty typu @Vložiteľné objekty je možné použiť aj ako MapaHodnoty podobným spôsobom.

4. Používanie @MapKey

Ako všetci vieme, požiadavky sa časom menia - takže teraz si povedzme musíme uložiť nejaké ďalšie atribúty Položka spolu s názov položky a itemPrice:

@Entity @Table (name = "item") verejná trieda Item {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") private String itemName; @Column (name = "price") dvojitá súkromná položkaCena; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") private Date createdOn; // štandardné getre a setre}

Podľa toho sa zmeňme Mapa do Mapa v objednať trieda entity:

@Entity @Table (name = "objednávky") verejná trieda Order {@Id @GeneratedValue @Column (name = "id") private int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item") referencedColumnName = "id")}) @MapKey (name = "itemName") súkromná mapa itemMap; }

Upozorňujeme, že tentokrát použijeme @MapKey anotáciu, aby mohol režim dlhodobého spánku použiť Položkanázov položky ako stĺpec kľúča mapy namiesto zavedenia ďalšieho stĺpca do tabuľky spojenia. Takže v tomto prípade spojovacia tabuľka mapovanie_objednávky_objednávkynemá stĺpec s kľúčom - namiesto toho odkazuje na JatemMeno.

To je v kontraste s @MapKeyColumn. Kedy používame @MapKeyColumn, kľúč mapy sa nachádza v spojovacej tabuľke. To je dôvod, prečo nemôžeme definovať naše mapovanie entít pomocou oboch anotácií spolu.

Tiež itemMap je mapa typu entity, preto musíme vzťah anotovať pomocou @OneToMany alebo @ManyToMany.

5. Používanie @MapKeyEnumerated a @MapKeyTemporal

Kedykoľvek zadáme enum ako Mapa kľúč, používame @MapKeyEnumerated. Podobne pre časové hodnoty @MapKeyTemporal sa používa. Správanie je dosť podobné štandardu @ Vymenované a @ Temporal anotácie.

Predvolene sú podobné @MapKeyColumn v tom v tabuľke spojenia sa vytvorí stĺpec kľúča. Ak chceme znovu použiť hodnotu už uloženú v pretrvávajúcej entite, mali by sme pole dodatočne označiť @MapKey.

6. Používanie @MapKeyJoinColumn

Ďalej povedzme, že musíme tiež sledovať predajcu každej položky. Jedným zo spôsobov, ako to môžeme urobiť, je pridať a Predávajúci subjekt a viazať to na našu Položka subjekt:

@Entity @Table (name = "seller") verejná trieda Predajca {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") private String sellerName; // štandardné getre a setre}
@Entity @Table (name = "item") verejná trieda Item {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") private String itemName; @Column (name = "price") dvojitá súkromná položkaCena; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") private Date createdOn; @ManyToOne (cascade = CascadeType.ALL) @JoinColumn (name = "seller_id") súkromný predajca; // štandardné getre a setre}

V takom prípade predpokladajme, že náš prípad použitia je zoskupiť všetky objednať‘S Položkas tým Predávajúci. Preto sa poďme zmeniť Mapa do Mapa:

@Entity @Table (name = "objednávky") verejná trieda Order {@Id @GeneratedValue @Column (name = "id") private int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item") referencedColumnName = "id")}) @MapKeyJoinColumn (name = "seller_id") private Map sellerItemMap; // štandardné getre a setre}

Musíme pridať @MapKeyJoinColumn dosiahnuť to, pretože táto anotácia umožňuje režimu dlhodobého spánku ponechať seller_id stĺpec (kľúč mapy) v spojovacej tabuľke mapovanie_položky_objednávky spolu s item_id stĺpec. Takže potom, v čase načítania údajov z databázy, môžeme vykonať a SKUPINA PODĽA prevádzka ľahko.

7. Záver

V tomto článku sme sa dozvedeli o niekoľkých spôsoboch pretrvávania Mapa v režime dlhodobého spánku v závislosti od požadovaného mapovania.

Ako vždy, zdrojový kód tohto tutoriálu nájdete cez Github.


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