o mapowaniu powiązanych jednostek w hibernate dowiedzieliśmy się już w poprzednich samouczkach, takich jak mapowanie jeden do jednego i mapowanie jeden do wielu. Tam chcieliśmy zapisać zmapowaną istotę, gdy podmiot właściciela relacji został zapisany. Aby to włączyć, użyliśmy atrybutu „CascadeType”. W tym samouczku typu kaskadowego JPA, dowiemy się o różnych rodzajach dostępnych opcji kaskadowania poprzez CascadeType.
jak działają typy kaskadowe JPA?
zanim przejdziemy do przodu, przyjrzyjmy się, jak ten atrybut typu kaskadowego jest zdefiniowany w kodzie. Weźmy przykład dla lepszego zrozumienia. Weź scenariusz, w którym pracownik może mieć wiele kont; ale jedno konto musi być powiązane tylko z jednym pracownikiem. Stwórzmy podmioty z minimalną ilością informacji dla jasności.
pracownik.Java
konto.java
spójrz na pogrubioną linię w powyższym kodzie źródłowym dla EmployeeEntity.java
. Definiuje ” cascade=CascadeType.ALL
„I zasadniczo oznacza to, że każda zmiana nastąpiła na EmployeeEntity
musi również przebiegać kaskadowo do AccountEntity
. Jeśli zapiszesz pracownika, wszystkie powiązane konta zostaną również zapisane w bazie danych. Jeśli usuniesz pracownika, wszystkie konta powiązane z tym pracownikiem również zostaną usunięte. Dość proste.
ale co, jeśli chcemy tylko kaskadowo zapisywać tylko operacje, ale nie usuwać operacji. Następnie musimy jasno określić go za pomocą poniższego kodu.
teraz tylko wtedy, gdy metody save() lub persist() są wywoływane przy użyciu instancji employee, wtedy tylko konta będą utrzymywane. Jeśli jakakolwiek inna metoda jest wywoływana na sesji, jej efekt nie wpłynie / kaskada do kont.
typy kaskadowe JPA
typy kaskadowe obsługiwane przez architekturę Java Persistence są następujące:
- CascadeType.PERSIST :Typ kaskadowy
presist
oznacza, że operacje save() lub persist() są kaskadowe dla powiązanych jednostek. - CascadeType.Połącz : Typ kaskadowy
merge
oznacza, że powiązane jednostki są scalane, gdy podmiot będący właścicielem jest scalany. - CascadeType.REFRESH :Typ cascade
refresh
robi to samo dla operacji refresh (). - CascadeType.Usuń: Typ kaskadowy
remove
usuwa wszystkie powiązane jednostki z tym ustawieniem, gdy podmiot będący właścicielem jest usuwany. - CascadeType.Odłączanie: Typ kaskadowy
detach
odłącza wszystkie powiązane jednostki, jeśli wystąpi „ręczne odłączanie”. - CascadeType.Wszystkie : Typ kaskadowy
all
jest skrótem dla wszystkich powyższych operacji kaskadowych.
w JPA nie ma domyślnego typu kaskadowego. Domyślnie żadne operacje nie są wykonywane kaskadowo.
Opcja konfiguracji kaskadowej akceptuje tablicę typów kaskadowych; tak więc, aby uwzględnić tylko odświeżania i scalanie w operacji kaskadowej dla relacji jeden do wielu, jak w naszym przykładzie, możesz zobaczyć następujące:
powyżej kaskadowa spowoduje, że kolekcja kont będzie tylko scalana i odświeżana.
Hibernate Kaskada typów
teraz pozwala zrozumieć, co jest kaskada w hibernate, w którym scenariuszu go używamy.
poza typami kaskadowymi JPA, istnieje jeszcze jedna operacja kaskadowa w hibernate, która nie jest częścią omawianego powyżej zestawu normalnego, zwana „usuwaniem osieroconych”. Powoduje to usunięcie posiadanego obiektu z bazy danych po usunięciu go z relacji własności.
zrozummy na przykładzie. W naszym przykładzie jednostki pracowniczej i konta zaktualizowałem je jak poniżej i wspomniałem „orphanRemoval = true” na kontach. Zasadniczo oznacza to, że za każdym razem, gdy usunę „konto z konta” (co oznacza, że usuwam relację między tym kontem a pracownikiem), należy również usunąć podmiot konta, który nie jest powiązany z żadnym innym pracownikiem w bazie danych (np. sierota).
pracownik.Java
konto.java
TestOrphanRemovalCascade.java
jest to bardzo dobry sposób na usunięcie pasujących/niedopasowanych elementów z kolekcji (np. relacji wiele-do-jednego lub jeden-do-wielu). Wystarczy usunąć przedmiot z kolekcji, a hibernate zajmie się resztą rzeczy za Ciebie. Sprawdzi, czy encja jest odwoływana z dowolnego miejsca, czy nie; jeśli tak nie jest, usunie encję z samej bazy danych.
Daj mi znać o swoich przemyśleniach i pytaniach na temat hibernate 5 typów kaskadowych lub typów kaskadowych JPA, jeśli w ogóle.
udanej nauki !!
Oracle Blog o typach kaskadowych