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
- Příklad vztahu ManyToOne anotaceEdit
- Příklad vztahu ManyToOne vztah XMLEdit
- Viz takéEdit
- Časté problémyEdit
- Cizí klíč je zároveň součástí primárního klíče.Upravit
- Cizí klíč je také mapován jako základní. upravit
- Chyba omezení při vložení. upravit
- Hodnota cizího klíče je nullUpravit
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
.