
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.