Występuje następujący problem podczas próby aktualizacji mojej jednostki:
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
Mam podmiot nadrzędny i ma on Set<...>
niektóre podmioty podrzędne. Kiedy próbuję go zaktualizować, otrzymuję wszystkie odniesienia do tych kolekcji i ustawiam je.
Poniższy kod reprezentuje moje mapowanie:
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
Próbowałem wyczyścić tylko zestaw <..>, zgodnie z tym: Jak „możliwe” rozwiązać problem, ale to nie zadziałało.
Jeśli masz jakieś pomysły, daj mi znać.
Dzięki!
java
hibernate
hibernate-mapping
axcdnt
źródło
źródło
something.manyother.remove(other)
jeślimanyother
jestList<T>
. Zrób wiele innych Zmiennych, polubArrayList<T>
i użyjorphanDelete = true
Odpowiedzi:
Sprawdź wszystkie miejsca, w których przypisujesz coś do sonEntities. Odnośnik, do którego się odnosisz, wyraźnie wskazuje na utworzenie nowego zestawu HashSet, ale możesz napotkać ten błąd przy każdym ponownym przypisaniu zestawu. Na przykład:
Zwykle chcesz tylko „nowy” zestaw raz w konstruktorze. Za każdym razem, gdy chcesz dodać lub usunąć coś z listy, musisz zmodyfikować zawartość listy zamiast przypisywać nową listę.
Aby dodać dzieci:
Aby usunąć dzieci:
źródło
Metoda:
działa, jeśli
parentEntity
jest odłączony i ponownie, jeśli go zaktualizujemy.Ale jeśli jednostka nie jest oddzielona od kontekstu (tj. Operacje wyszukiwania i aktualizacji są w tej samej transakcji), działa poniższa metoda.
źródło
Kiedy czytałem w różnych miejscach, których hibernacja nie lubiła przypisywać do kolekcji, założyłem, że najbezpieczniejszym rozwiązaniem byłoby oczywiście ostateczne:
Jednak to nie działa i pojawia się przerażający błąd „nie ma już odniesienia”, co w tym przypadku jest dość mylące.
Okazuje się, że hibernacja wywołuje metodę setRoles ORAZ chce zainstalować tutaj swoją specjalną klasę kolekcji i nie zaakceptuje twojej klasy kolekcji. Długo mnie to zaskoczyło, pomimo przeczytania wszystkich ostrzeżeń o nieprzypisywaniu do Twojej kolekcji w ustawionej metodzie.
Więc zmieniłem na:
Tak więc przy pierwszym wywołaniu hibernacja instaluje swoją specjalną klasę, a przy kolejnych wywołaniach możesz użyć tej metody samodzielnie, nie niszcząc wszystkiego. Jeśli chcesz użyć swojej klasy jako fasoli, prawdopodobnie potrzebujesz działającego setera, a przynajmniej to wydaje się działać.
źródło
List<String> list = new ArrayList<>();
. Zmieniłem to, abyList<String> list = null;
rozwiązać problem :)W rzeczywistości mój problem dotyczył równości i kodu skrótu moich bytów. Stary kod może przynieść wiele problemów, nigdy nie zapomnij go sprawdzić. Wszystko, co zrobiłem, to po prostu utrzymywać strategię usuwania-osieroconych i poprawiać równość i kod skrótu.
źródło
Miałem ten sam błąd. Problemem było dla mnie to, że po zapisaniu encji odwzorowana kolekcja nadal była pusta i podczas próby aktualizacji encji wyjątek został zgłoszony. Co mi pomogło: Zapisanie encji, następnie odświeżenie (kolekcja nie jest już pusta), a następnie wykonanie aktualizacji. Może zainicjowanie kolekcji za pomocą nowej ArrayList () lub coś innego może również pomóc.
źródło
MA TYP RELACJI:
Nie próbuj tworzyć instancji kolekcji, gdy jest zadeklarowana
hasMany
, po prostu dodawaj i usuwaj obiekty.UŻYJ RODZAJU RELACJI:
Ale kolekcja może być pusta tylko wtedy, gdy zostanie zadeklarowana jako właściwość (relacja użycia) i nie zostanie zainicjowana w deklaracji.
źródło
Zastosowałem podejście @ user2709454 z niewielką poprawą.
źródło
Miałem ten problem podczas próby użycia
TreeSet
. Zainicjowałem zaoneToMany
pomocąTreeSet
których działaSpowoduje to jednak błąd opisany
question
powyżej. Wygląda więc na to, żehibernate
obsługiwane,SortedSet
a jeśli po prostu zmień powyższą linię nadziała jak magia :) Więcej informacji na temat
hibernate SortedSet
można znaleźć tutajźródło
Ten błąd pojawia się tylko wtedy, gdy próbuję przekazać wartość NULL do elementu ustawiającego dla kolekcji. Aby temu zapobiec, moi seterzy wyglądają tak:
źródło
Natrafiłem na to podczas aktualizacji encji za pomocą żądania postu JSON. Błąd wystąpił, gdy zaktualizowałem byt bez danych o dzieciach, nawet jeśli nie było żadnych. Dodawanie
do ciała żądania rozwiązało problem.
źródło
Inną przyczyną może być używanie lombok.
@Builder
- powoduje, że oszczędzasz,Collections.emptyList()
nawet jeśli mówisz.myCollection(new ArrayList());
@Singular
- ignoruje wartości domyślne na poziomie klasy i pozostawia pole,null
nawet jeśli pole klasy zostało zadeklarowane jakomyCollection = new ArrayList()
Moje 2 centy, spędziłem 2 godziny z tym samym :)
źródło
Dostawałem,
A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
kiedy ustawiałemparent.setChildren(new ArrayList<>())
. Kiedy się zmieniłemparent.getChildren().clear()
, rozwiązało to problem.Sprawdź więcej szczegółów: HibernateException - kolekcja z kaskadą = „wszystko-usuń-sierota” nie była już przywoływana przez instancję będącą właścicielem .
źródło
Korzystam z Spring Boot i miałem ten problem z kolekcją, mimo że nie nadpisałem go bezpośrednio, ponieważ deklaruję dodatkowe pole dla tej samej kolekcji za pomocą niestandardowego serializatora i deserializatora , aby zapewnić bardziej przyjazną dla interfejsu reprezentację dane:
Wydaje się, że mimo iż nie jestem nadpisywania kolekcji siebie The deserializacji robi to pod maską, wywołując ten problem tak samo. Rozwiązaniem było zmienić seter związany z deserializatorem, aby wyczyścił listę i dodał wszystko, zamiast go nadpisywać:
źródło
Miałem ten sam problem, ale było to, gdy zestaw był zerowy. Tylko w kolekcji Ustaw na liście prac znaleźć. Możesz spróbować hibernować adnotację @LazyCollection (LazyCollectionOption.FALSE) zamiast adnotacji JPA fetch = FetchType.EAGER.
Moje rozwiązanie: To jest moja konfiguracja i działa dobrze
źródło
Ten sam błąd występował podczas dodawania obiektu potomnego do istniejącej listy obiektów potomnych.
Rozwiązaniem mojego problemu jest zmiana na:
Teraz dziecko ożywa z innymi szczegółami i działało dobrze.
źródło
Dodanie mojej głupiej odpowiedzi. Używamy Spring Data Rest. To był nasz dość standardowy związek. Wzór został użyty gdzie indziej.
W związku, który stworzyliśmy, zawsze było zamierzone, aby dzieci były dodawane poprzez własne repozytorium. Nie dodałem jeszcze repozytorium. Test integracji, który przeprowadziliśmy, obejmował pełny cykl życia jednostki za pośrednictwem wywołań REST, aby transakcje były zamykane między żądaniami. Brak repo dla dziecka oznaczało, że Json miał dzieci jako część głównej struktury zamiast w
_embedded
. Uaktualnienia rodzica spowodowałyby wówczas problemy.źródło
Poniższe rozwiązanie działało dla mnie
źródło
Zamiast przypisywać nową kolekcję
Zamień wszystkie elementy na
źródło
Uważaj z
Ta metoda również przerywa hibernację.
źródło
Może to być spowodowane przez
hibernate-enhance-maven-plugin
. Kiedy włączyłemenableLazyInitialization
właściwość, ten wyjątek zaczął się dziać w mojej leniwej kolekcji. Używam hibernacji 5.2.17.Zwróć uwagę na dwa problemy z hibernacją:
źródło
Mój był zupełnie inny z Spring Boot! Dla mnie nie było to spowodowane ustawieniem właściwości kolekcji.
W moich testach próbowałem utworzyć encję i otrzymywałem ten błąd dla kolejnej nieużywanej kolekcji!
Po tylu próbach właśnie dodałem
@Transactional
metodę testową i to rozwiązało. Nie ma jednak powodu.źródło
Jest to w przeciwieństwie do poprzednich odpowiedzi, miałem dokładnie ten sam błąd: „Kolekcja z cascade =„ all-delete-orphan ”nie była już przywoływana ....”, gdy moja funkcja settera wyglądała tak:
A potem zniknął, kiedy zmieniłem go na prostą wersję:
(wersje hibernacyjne - wypróbowałem zarówno wersje 5.4.10, jak i 4.3.11. Spędziłem kilka dni próbując różnego rodzaju rozwiązań, zanim wróciłem do prostego zadania w seterie. Teraz jestem zdezorientowany, dlaczego tak jest.)
źródło