Relacja ManyToOne
w Javie to sytuacja, w której obiekt źródłowy posiada atrybut, który odwołuje się do innego obiektu, obiektu docelowego. Tzn. dość typowy przypadek w Javie, że jeden obiekt posiada referencję do innego obiektu. Relacja ManyToOne
może być określona jednokierunkowo. Jednak typowe jest, że obiekt docelowy ma odwrotną relację określoną z powrotem do obiektu źródłowego. Byłaby to specyfikacja relacji OneToMany
w obiekcie docelowym. Wszystkie relacje w Javie i JPA są jednokierunkowe, w tym sensie, że jeśli obiekt źródłowy odwołuje się do obiektu docelowego, nie ma gwarancji, że obiekt docelowy również ma relację do obiektu źródłowego. Różni się to od relacyjnej bazy danych, w której relacje są definiowane za pomocą kluczy obcych i zapytań w taki sposób, że odwrotne zapytanie zawsze istnieje.
W JPA relacja ManyToOne
jest określana za pomocą adnotacji @ManyToOne
lub elementu <many-to-one>
. Adnotacji @ManyToOne
zazwyczaj towarzyszy adnotacja @JoinColumn
. Adnotacja @JoinColumn
określa, w jaki sposób relacja powinna być odwzorowana (wyrażona w) w bazie danych. Adnotacja @JoinColumn
określa nazwę kolumny klucza obcego (@JoinColumn(name = "...")
) w obiekcie źródłowym, która powinna być użyta do odnalezienia (dołączenia) obiektu docelowego.
Jeżeli w obiekcie docelowym określona jest odwrotna relacja OneToMany
, to adnotacja @OneToMany
w obiekcie docelowym musi zawierać atrybut mappedBy
definiujący tę odwrotną relację.
JPA definiuje również relację OneToOne
, która jest podobna do relacji ManyToOne
, z tym wyjątkiem, że relacja odwrotna (gdyby została zdefiniowana) jest relacją OneToOne
. Główna różnica pomiędzy relacją OneToOne
a ManyToOne
w JPA polega na tym, że relacja ManyToOne
zawsze zawiera klucz obcy z tabeli obiektu źródłowego do tabeli obiektu docelowego, podczas gdy w relacji OneToOne
klucz obcy może znajdować się albo w tabeli obiektu źródłowego albo w tabeli obiektu docelowego.
- Przykład relacji ManyToOne databaseEdit
- Przykład relacji ManyToOne annotationsEdit
- Przykład relacji ManyToOne relationship XMLEdit
- See AlsoEdit
- Common ProblemsEdit
- Klucz obcy jest również częścią klucza podstawowego.Edit
- Klucz obcy jest również odwzorowany jako podstawowy.Edit
- Constraint error on insert.Edit
- Wartość klucza obcego jest nullEdit
Przykład relacji ManyToOne databaseEdit
EMPLOYEE (tabela)
EMP_ID | FIRSTNAME | LASTNAME | SALARY | MANAGER_ID |
1 | Bob | Way | 50000 | 2 |
2 | Sarah | Smith | 75000 | null |
PHONE (tabela)
ID | TYPE | AREA_CODE | P_NUMBER | OWNER_ID |
1 | home | 613 | 792-.0000 | 1 |
2 | work | 613 | 896-.1234 | 1 |
3 | praca | 416 | 123-.4444 | 2 |
Przykład relacji ManyToOne annotationsEdit
@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; ...
Przykład relacji ManyToOne relationship 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>
See AlsoEdit
- Relationships
- Cascading
- Lazy Fetching
- Target Entity
- Join Fetching
- Batch Reading
- Common Problems
.
- OneToOne
- Mapping a OneToOne Using a Join Table
- OneToMany
Common ProblemsEdit
Klucz obcy jest również częścią klucza podstawowego.Edit
Zobacz Klucze podstawowe poprzez relacje OneToOne.
Klucz obcy jest również odwzorowany jako podstawowy.Edit
Jeśli używasz tego samego pola w dwóch różnych odwzorowaniach, zwykle wymagane jest uczynienie jednego z nich tylko do odczytu przy użyciu insertable, updatable = false
. Zobacz docelowe klucze obce, dołączanie kolumn klucza podstawowego, kaskadowe klucze podstawowe.
Constraint error on insert.Edit
To zwykle występuje, ponieważ nieprawidłowo zmapowałeś klucz obcy w relacji OneToOne
.Zobacz Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys. Może to również wystąpić, jeśli twój dostawca JPA nie obsługuje integralności referencyjnej lub nie rozwiązuje dwukierunkowych ograniczeń. W tym przypadku może być konieczne usunięcie ograniczenia lub użycie EntityManager
flush()
, aby zapewnić kolejność, w jakiej obiekty są zapisane.
Wartość klucza obcego jest nullEdit
Upewnij się, że ustawiłeś wartość OneToOne
obiektu, jeśli OneToOne
jest częścią dwukierunkowej relacji OneToMany
, upewnij się, że ustawiłeś OneToOne
obiektu podczas dodawania obiektu do OneToMany
, JPA nie utrzymuje dla ciebie dwukierunkowych relacji. Sprawdź również, czy poprawnie zdefiniowałeś JoinColumn
, upewnij się, że nie ustawiłeś insertable, updateable = false
lub nie użyłeś PrimaryKeyJoinColumn
.