Myślę, że źle zrozumiałem znaczenie kaskadowania w kontekście @ManyToOne
związku.
Walizka:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
Jakie jest znaczenie tego cascade = CascadeType.ALL
? Na przykład, jeśli usunę określony adres z bazy danych, w jaki sposób fakt, że dodałem, cascade = CascadeType.ALL
wpływa na moje dane ( User
jak sądzę)?
Zobacz tutaj przykład z dokumentów OpenJPA.
CascadeType.ALL
oznacza, że wykona wszystkie działania.Zacytować:
Sebastian
źródło
Jak wyjaśniono w tym artykule oraz w mojej książce, wysoka wydajność Java Persistence , nie należy używać
CascadeType.ALL
na@ManyToOne
od przejścia państwowych jednostka powinna propagować od podmiotów dominujących na nich dziecka, nie na odwrót.@ManyToOne
Strona jest zawsze stowarzyszenie Dziecko od odwzorowuje to pod spodem kolumny klucz obcy.Dlatego należy przenieść
CascadeType.ALL
ze@ManyToOne
stowarzyszenia do@OneToMany
strony, która powinna również użyćmappedBy
atrybutu, ponieważ jest to najbardziej efektywne odwzorowanie relacji tabeli jeden-do-wielu .źródło
Ze specyfikacji EJB3.0 :
Krótko mówiąc, relacje encji zdefiniowane za pomocą
CascadeType.All
zapewnią, że wszystkie zdarzenia utrwalania, takie jak utrwalanie, odświeżanie, scalanie i usuwanie, które występują na rodzicu, zostaną przekazane do dziecka. Zdefiniowanie innychCascadeType
opcji zapewnia deweloperowi bardziej szczegółowy poziom kontroli nad tym, jak powiązanie encji obsługuje trwałość.Na przykład, gdybym miał obiekt Book zawierający Listę stron i dodam obiekt strony na tej liście. Jeśli
@OneToMany
adnotacja definiująca powiązanie między Książką a Stroną zostanie oznaczona jakoCascadeType.All
, utrwalenie Książki spowoduje utrwalenie Strony również w bazie danych.źródło
W JPA 2.0, jeśli chcesz usunąć adres, jeśli usunąłeś go z encji użytkownika, którą możesz dodać
orphanRemoval=true
(zamiastCascadeType.REMOVE
) do swojej@OneToMany
.Więcej wyjaśnień pomiędzy
orphanRemoval=true
iCascadeType.REMOVE
jest tutaj .źródło
Jeśli chcesz tylko usunąć adres przypisany do użytkownika i nie wpływać na klasę encji User, powinieneś spróbować czegoś takiego:
W ten sposób nie musisz się martwić korzystaniem z funkcji pobierania w adnotacjach. Pamiętaj jednak, że usuwając użytkownika usuniesz również podłączony adres do obiektu użytkownika.
źródło