Java Persistence/ManyToOne

author
3 minutes, 57 seconds Read

Vztah ManyToOne v Javě je takový, kdy zdrojový objekt má atribut, který odkazuje na jiný objekt, cílový objekt. Tj. poměrně typický případ Javy, kdy jeden objekt drží odkaz na jiný objekt. Vztah ManyToOne může být zadán jednosměrně. Typické však je, že cílový objekt má zpětně zadán inverzní vztah ke zdrojovému objektu. To by byla specifikace vztahu OneToMany v cílovém objektu. Všechny vztahy v Javě a JPA jsou jednosměrné v tom smyslu, že pokud zdrojový objekt odkazuje na cílový objekt, není zaručeno, že cílový objekt má také vztah ke zdrojovému objektu. To je rozdíl oproti relační databázi, ve které jsou vztahy definovány prostřednictvím cizích klíčů a dotazů tak, že vždy existuje inverzní dotaz.

V JPA je vztah ManyToOne specifikován prostřednictvím anotace @ManyToOne nebo elementu <many-to-one>. Anotace @ManyToOne je obvykle doprovázena anotací @JoinColumn. Anotace @JoinColumn určuje, jak má být vztah mapován do databáze (vyjádřen v ní). Anotace @JoinColumn definuje název sloupce cizího klíče (@JoinColumn(name = "...")) ve zdrojovém objektu, který by měl být použit pro vyhledání (připojení) cílového objektu.

Je-li v cílovém objektu specifikován reverzní vztah OneToMany, pak anotace @OneToMany v cílovém objektu musí obsahovat atribut mappedBy, který definuje tento inverzní vztah.

JPA také definuje vztah OneToOne, který je podobný vztahu ManyToOne, s tím rozdílem, že inverzní vztah (pokud by byl definován) je vztah OneToOne. Hlavní rozdíl mezi vztahem OneToOne a ManyToOne v JPA je ten, že ManyToOne vždy obsahuje cizí klíč z tabulky zdrojového objektu do tabulky cílového objektu, zatímco u vztahu OneToOne může být cizí klíč buď v tabulce zdrojového objektu, nebo v tabulce cílového objektu.

Příklad vztahu ManyToOne databázeEdit

EMPLOYEE (tabulka)

.

EMP_ID FIRSTNAME LASTNAME SALARY MANAGER_ID
1 Bob Way 50000 2
2 Sarah Smith 75000 null

PHONE (table)

ID TYPE AREA_CODE P_NUMBER OWNER_ID
1 home 613 792-0000 1
2 práce 613 896-1234 1
3 práce 416 123-4444 2

Příklad vztahu ManyToOne anotaceEdit

@Entitypublic class Phone { @Id private long id; ... // Specifies the PHONE table does not contain an owner column, but // an OWNER_ID column with a foreign key. And creates a join to // lazily fetch the owner @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="OWNER_ID") private Employee owner; ...}// Specification of the reverse OneToMany relationship in Employee@Entitypublic class Employee { @Id private long emp_id; ... // The 'mappedBy = "owner"' attribute specifies that // the 'private Employee owner;' field in Phone owns the // relationship (i.e. contains the foreign key for the query to // find all phones for an employee.) @OneToMany(mappedBy = "owner") private List<Phone> phones; ...

Příklad vztahu ManyToOne vztah XMLEdit

<entity name="Phone" class="org.acme.Phone" access="FIELD"> <attributes> <id name="id"/> <many-to-one name="owner" fetch="LAZY"> <join-column name="OWNER_ID"/> </many-to-one> </attributes></entity>

Viz takéEdit

  • Vztahy
    • Kaskádové
    • Lazy Fetching
    • Cílová entita
    • Spojené načítání
    • Dávkové čtení
    • Obvyklé problémy
  • OneToOne
    • Mapování a OneToOne pomocí Join Table
  • OneToMany

Časté problémyEdit

Cizí klíč je zároveň součástí primárního klíče.Upravit

Viz Primární klíče prostřednictvím vztahů OneToOne.

Cizí klíč je také mapován jako základní. upravit

Pokud používáte stejné pole ve dvou různých mapováních, obvykle vyžadujete, aby jedno z nich bylo pouze pro čtení pomocí insertable, updatable = false. Viz Cílové cizí klíče, sloupce pro spojení primárních klíčů, kaskádové primární klíče.

Chyba omezení při vložení. upravit

K tomu obvykle dochází, protože jste nesprávně namapovali cizí klíč ve vztahu OneToOne. viz Cílové cizí klíče, sloupce pro spojení primárních klíčů, kaskádové primární klíče. Může se také vyskytnout, pokud váš poskytovatel JPA nepodporuje referenční integritu nebo neřeší obousměrná omezení. V takovém případě může být nutné buď omezení odstranit, nebo použít EntityManager flush(), abyste zajistili pořadí, v jakém jsou vaše objekty zapsány.

Hodnota cizího klíče je nullUpravit

Zajistěte nastavení hodnoty OneToOne objektu, pokud je OneToOne součástí obousměrného vztahu OneToMany, zajistěte nastavení OneToOne objektu při přidávání objektu do OneToMany, JPA za vás neudržuje obousměrné vztahy. Zkontrolujte také, zda jste správně definovali JoinColumn, ujistěte se, že jste nenastavili insertable, updateable = false nebo nepoužili PrimaryKeyJoinColumn.

Similar Posts

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.