Relacje między tabelami a relacje encji
W systemie relacyjnej bazy danych mogą istnieć tylko trzy typy relacji między tabelami:
- jeden do wielu (przez kolumnę klucza obcego)
- jeden do jednego (przez wspólny klucz podstawowy)
- wiele do wielu (poprzez tabelę łączącą z dwoma kluczami obcymi odwołującymi się do dwóch oddzielnych tabel nadrzędnych)
Tak więc one-to-manyrelacja między tabelami wygląda następująco:

Zauważ, że relacja jest oparta na kolumnie Foreign Key (np. post_id) W tabeli podrzędnej.
Tak więc istnieje jedno źródło prawdy, jeśli chodzi o zarządzanie one-to-manyrelacjami między stołami.
Teraz, jeśli weźmiesz dwukierunkową relację encji, która mapuje na one-to-manyrelację między tabelami, którą widzieliśmy wcześniej:

Jeśli spojrzysz na powyższy diagram, zobaczysz, że istnieją dwa sposoby zarządzania tą relacją.
W Postjednostce masz commentskolekcję:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
A w PostCommentThe poststowarzyszenie jest odwzorowany w sposób następujący:
@ManyToOne(
fetch = FetchType.LAZY
)
@JoinColumn(name = "post_id")
private Post post;
Masz więc dwie strony, które mogą zmienić powiązanie encji:
- Dodając wpis do
commentskolekcji podrzędnej, nowy post_commentwiersz powinien zostać powiązany z postjednostką nadrzędną za pośrednictwem jejpost_id kolumny.
- Ustawiając
postwłaściwość PostCommentjednostki, post_idnależy również zaktualizować kolumnę.
Ponieważ istnieją dwa sposoby przedstawiania kolumny klucza obcego, należy określić, który jest źródłem prawdy, jeśli chodzi o tłumaczenie zmiany stanu skojarzenia na odpowiadającą jej modyfikację wartości kolumny klucza obcego.
MappedBy (inaczej strona odwrotna)
mappedByAtrybut informuje, że @ManyToOnestrona jest odpowiedzialna za zarządzanie kolumny klucz obcy, a zbiór jest używany tylko do pobierania jednostek podrzędnych i kaskady zmian stanu podmiotem dominującym dla dzieci (na przykład usuwając rodzic powinien także usunąć podmioty podrzędne).
Nazywa się odwrotną stroną, ponieważ odwołuje się do właściwości jednostki podrzędnej, która zarządza tą relacją między tabelami.
Zsynchronizuj obie strony skojarzenia dwukierunkowego
Teraz, nawet jeśli zdefiniowałeś mappedByatrybut i @ManyToOnepowiązanie po stronie podrzędnej zarządza kolumną klucza obcego, nadal musisz zsynchronizować obie strony skojarzenia dwukierunkowego.
Najlepszym sposobem na to jest dodanie dwóch metod narzędziowych:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
addCommentI removeCommentmetody zapewnienia, że obie strony są zsynchronizowane. Tak więc, jeśli dodamy jednostkę podrzędną, jednostka podrzędna musi wskazywać na jednostkę nadrzędną, a jednostka nadrzędna powinna zawierać element podrzędny w kolekcji podrzędnej.
Aby uzyskać więcej informacji na temat najlepszego sposobu synchronizacji wszystkich dwukierunkowych typów skojarzeń encji, zapoznaj się z tym artykułem .