Java Persistence/ManyToOne

author
3 minutes, 42 seconds Read

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

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.

Similar Posts

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.