Jaka jest różnica pomiędzy
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
i
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Ten przykład pochodzi z samouczka Java EE, ale nadal nie rozumiem szczegółów.
java
jpa
cascading-deletes
rand0m86
źródło
źródło
Odpowiedzi:
Od tutaj : -
źródło
Łatwy sposób na zrozumienie różnicy między
CascadeType.REMOVE
iorphanRemoval=true
.W przypadku usuwania osieroconych: jeśli wywołasz
setOrders(null)
, powiązaneOrder
jednostki zostaną automatycznie usunięte w bazie danych.W przypadku kaskady usuwania: w przypadku wywołania
setOrders(null)
powiązaneOrder
jednostki NIE zostaną automatycznie usunięte w bazie danych.źródło
Załóżmy, że mamy byt potomny i podmiot nadrzędny. Rodzic może mieć kilkoro dzieci.
OrphanRemoval to koncepcja ORM, która mówi, czy dziecko zostało osierocone. należy go również usunąć z bazy danych.
Dziecko zostaje osierocone, gdy nie można uzyskać do niego dostępu od rodzica. Na przykład, jeśli usuniemy zestaw obiektów Person (ustawiając go na pusty zestaw) lub zastąpimy go nowym zestawem, wówczas rodzic nie będzie już miał dostępu do dzieci ze starego zestawu, a dzieci zostaną osierocone, więc dzieci są skazane na usunięte również w bazie danych.
CascadeType.REMOVE to koncepcja na poziomie bazy danych i mówi, że jeśli rodzic zostanie usunięty, wszystkie powiązane rekordy w tabeli podrzędnej powinny zostać usunięte.
źródło
Praktycznie różnica polega na tym, czy próbujesz zaktualizować dane (PATCH), czy całkowicie je zastąpić (PUT)
Załóżmy, że usuniesz, a
customer
użyciecascade=REMOVE
usunie również zamówienia klientów, które wydają się zamierzone i przydatne.Teraz powiedzmy, że aktualizujesz plik za
customer
pomocąorphanRemoval="true"
nim spowoduje usunięcie wszystkich poprzednich zamówień i zastąpić je z jednym warunkiem. (PUT
pod względemREST API
)Bez
orphanRemoval
starych zamówień byłby zachowany. (PATCH
pod względemREST API
)źródło
CascadeType.REMOVE
CascadeType.REMOVE
Strategii, które można skonfigurować wyraźnie:lub odziedzicz to niejawnie ze
CascadeType.ALL
strategii:umożliwia propagowanie
remove
operacji z jednostki nadrzędnej do jej jednostek podrzędnych.Jeśli więc pobierzemy
Post
jednostkę nadrzędną wraz z jejcomments
kolekcją i usuniemypost
jednostkę:Hibernate wykona trzy instrukcje usuwania:
Jednostki
PostComment
podrzędne zostały usunięte z powoduCascadeType.REMOVE
strategii, która działała tak, jakbyśmy usunęli również jednostki podrzędne.Strategia usuwania sierot
Strategia usuwania sierot, którą należy ustawić za pomocą
orphanRemoval
atrybutu:umożliwia usunięcie wiersza tabeli podrzędnej po usunięciu elementu podrzędnego z kolekcji.
Jeśli więc załadujemy
Post
jednostkę wraz z jejcomments
kolekcją i usuniemy pierwsząPostComment
zcomments
kolekcji:Hibernate ma zamiar wykonać instrukcję DELETE dla powiązanego
post_comment
wiersza tabeli:Aby uzyskać więcej informacji na ten temat, zapoznaj się również z tym artykułem .
źródło