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-many
relacja 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-many
relacjami między stołami.
Teraz, jeśli weźmiesz dwukierunkową relację encji, która mapuje na one-to-many
relację 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 Post
jednostce masz comments
kolekcję:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
A w PostComment
The post
stowarzyszenie 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
comments
kolekcji podrzędnej, nowy post_comment
wiersz powinien zostać powiązany z post
jednostką nadrzędną za pośrednictwem jejpost_id
kolumny.
- Ustawiając
post
właściwość PostComment
jednostki, post_id
należ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)
mappedBy
Atrybut informuje, że @ManyToOne
strona 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ś mappedBy
atrybut i @ManyToOne
powią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);
}
addComment
I removeComment
metody 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 .