Articles

Hibernace Jeden k Mnoha Anotace Výukový

Úvod

Tento rychlý Hibernace návod nás provede příklad one-to-many mapování pomocí JPA anotací, alternativa k XML.

dozvíme se také, jaké jsou obousměrné vztahy, jak mohou vytvářet nekonzistence a jak může myšlenka vlastnictví pomoci.

Další čtení:

Spring Boot s Hibernate

rychlý, praktický úvod do integrace Spring Boot a Hibernate/JPA.
Přečtěte si více →

přehled identifikátorů v režimu hibernace/JPA

Naučte se mapovat identifikátory entit pomocí režimu hibernace.
Čtěte více →

Popis

Jednoduše řečeno, jeden-k-mnoha mapování znamená, že jeden řádek v tabulce je mapován na více řádků v jiné tabulce.

Pojďme se podívat na tyto entity relationship diagram vidět one-to-many asociace:

v tomto příkladu, budeme realizovat košík systém, kde máme stůl pro každý vozík a další tabulky pro každou položku. Jeden vozík může mít mnoho položek, takže zde máme mapování one-to-many.

způsob, jakým to funguje na úrovni databáze je máme cart_id jako primární klíč v košíku tabulky a také cart_id jako cizí klíč v položkách.

způsob, jakým to děláme v kódu, je s @OneToMany.

řekněme, mapa Vůz třídy na Položky objekt způsobem, který odráží vztah v databázi:

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

můžeme také přidat odkaz do Košíku do Položky pomocí @ManyToOne, takže to obousměrný vztah. Obousměrný znamená, že jsme schopni přistupovat k položkám z vozíků a také k vozíkům z položek.

mappedBy majetek je to, co používáme říct, Hibernate, která proměnná jsme pomocí představují nadřazené třídy v naší třídu dítěte.

následující technologie a knihovny jsou používány za účelem vytvoření vzorku Hibernace aplikace, která provádí one-to-many asociace:

  • JDK 1.8 nebo novější
  • Hibernate 5
  • Maven 3 nebo novější
  • H2 databáze

Nastavení

3.1. Nastavení databáze

níže je náš databázový skript pro tabulky košíku a položek. Omezení cizího klíče používáme pro mapování one-to-many:

naše nastavení databáze je připraveno, takže přejdeme k vytvoření projektu Hibernate example.

3.2. Maven závislosti

pak přidáme závislosti hibernace a H2 ovladače do našeho pom.xml soubor. Závislost hibernace používá protokolování JBoss a automaticky se přidává jako přechodné závislosti:

  • hibernace verze 5.2.7.Final
  • H2 driver verze 1.4.197

navštivte centrální úložiště Maven, kde najdete nejnovější verze hibernace a závislostí H2.

3.3. Konfigurace hibernace

zde je konfigurace hibernace:

3.4. HibernateAnnotationUtil Třídy

S HibernateAnnotationUtil třídy, jen potřebujeme, aby odkazovaly na nový Hibernace konfiguračního souboru:

Modely

mapování související konfigurace se provádí pomocí JPA anotací v modelu tříd:

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

vezměte Prosím na vědomí, že @OneToMany anotace se používá k definování majetku v Položkách třídy, která bude použita na mapě mappedBy proměnné. Proto máme ve třídě položek vlastnost s názvem „košík“:

je také důležité poznamenat, že anotace @ManyToOne je spojena s proměnnou třídy košíku. @JoinColumn anotace odkazuje na mapovaný sloupec.

Akce

V testovací program, jsme se vytvořit třídy s main() metoda pro získání Hibernate Session a uložení modelu objektů do databáze provádí one-to-many asociace:

Toto je výstup z našeho testovacího programu:

@ManyToOne Anotace

Jak jsme viděli v kapitole 2, můžeme určit, mnoho-to-one vztah pomocí @ManyToOne anotace. Mnoho-to-one mapování znamená, že mnoho instancí této entity je mapováno na jednu instanci jiné entity-mnoho položek v jednom košíku.

anotace @ManyToOne nám umožňuje vytvářet také obousměrné vztahy. Podrobně se o tom budeme zabývat v několika následujících podsekcích.

6.1. Nekonzistence a vlastnictví

nyní, pokud košík odkazoval na položky, ale položky zase ne odkazovaly na košík, náš vztah by byl jednosměrný. Objekty by také měly přirozenou konzistenci.

v našem případě je však vztah obousměrný, což přináší možnost nekonzistence.

představme si situaci, kdy developer chce přidat položka1 do košíku a item2 na cart2, ale udělá chybu tak, že odkazy mezi cart2 a item2 stát nekonzistentní:

Jak je uvedeno výše, item2 odkazy cart2, vzhledem k tomu, že cart2 nemá referenční item2, a to je špatné.

jak by měl režim spánku uložit item2 do databáze? Bude item2 cizí klíč referenční cart1 nebo cart2?

tuto dvojznačnost vyřešíme pomocí myšlenky vlastnící strany vztahu; odkazy patřící vlastnící straně mají přednost a jsou uloženy do databáze.

6.2. Položky jako vlastnící Strana

Jak je uvedeno ve specifikaci JPA v části 2.9, je dobrým zvykem označit stranu many-to-one jako stranu vlastnící.

jinými slovy, položky by byly vlastní stranou a košík inverzní stranou, což je přesně to, co jsme udělali dříve.

tak jak jsme toho dosáhli?

zahrnutím atributu mappedBy do třídy košíku jej označíme jako inverzní stranu.

současně také anotujeme položky.košík pole s @ManyToOne, takže položky vlastnící stranu.

Vrátíme-li se k našemu příkladu „nekonzistence“, nyní Hibernate ví, že odkaz item2 je důležitější a uloží odkaz item2 do databáze.

pojďme zkontrolovat výsledek:

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

ačkoli košík odkazuje na item2 v našem úryvku, odkaz item2 na cart2 je uložen v databázi.

6.3. Košík jako vlastnící Strana

je také možné označit stranu one-to-many jako stranu vlastnící a stranu many-to-one jako inverzní stranu.

ačkoli to není doporučená praxe, pojďme do toho a zkusme to.

fragment kódu ukazuje implementace one-to-many straně jako vlastní straně:

Všimněte si, jak jsme odstranili mappedBy prvek a sada mnoha-to-one @JoinColumn jako zasunovatelné a aktualizovatelný na hodnotu false.

Pokud spustíme stejný kód, výsledek bude opačný:

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

Jak je uvedeno výše, nyní item2 patří do košíku.

závěr

viděli jsme, jak snadné je implementovat vztah one-to-many s databází Hibernate ORM a H2 pomocí anotací JPA.

dále jsme se dozvěděli o obousměrných vztazích a o tom, jak implementovat pojem vlastnící strana.