2011-08-22 14 views
6

Czasami wyczyszczenie wszystkich odwołań do obiektu jest dość trudne (lub problem z wydajnością).Błąd "Nie znaleziono jednostki" z JPA

Na przykład, mam obiekt Person, który ma relacje z innymi obiektami Person.

Kiedy usuwam Osobę, nie chcę jej usuwać we wszystkich relacjach, jakie może ona mieć po prostu dlatego, że czasami ten obiekt Person nie wie, gdzie jest przywoływany. Tak więc, jeśli chciałbym usunąć wszystkie odwołania, muszę wykonać dodatkową pracę sql, która może spowodować problem z wydajnością.

W idealnym świecie chciałbym usunąć obiekt Person i kiedy inna osoba odnosi się do tej osoby (ponieważ ma ona swój identyfikator w swoich relacjach), po prostu zwróć wartość null.

Faktem jest JPA zarzuca

javax.persistence.EntityNotFoundException: No row with the given identifier exists 

Czy istnieje sposób zmusić JPA, aby powrócić pustą referencję, a nie wyjątek w tym przypadku?

Odpowiedz

16

Można użyć @NotFound adnotacji o wartości NotFoundAction.IGNORE, która zwróci null, jeżeli podmiotem powiązanym nie istnieje.

Słowo ostrzeżenia: jeśli użyjesz tego w kolekcjach, a hibernacja nie znajdzie jednego z wpisów, doda w kolekcji wartość pustą, co jest bardzo denerwujące. Aby tego uniknąć, możesz opakować kolekcję w Kolekcję, która pomija wartości null.

+0

to było dokładnie to, czego szukałem! Dziękuję bardzo. To jest specyficzne dla hibernacji, prawda? –

+1

Cieszę się, że pomógł i tak, adnotacja jest hibernowana specyficzna – Augusto

+0

@Augusto Dlaczego dane Spring rzuca ten wyjątek na pierwszym miejscu? – svlada

5

Nie, przynajmniej nic standardowy (JPA)

Ale można kontrolować, co się dzieje z tymi związku z wykorzystaniem cascade przypisują ot @*ToMany i @*ToOne adnotacje.

0

Użyłbyś @NotFound (action = NotFoundAction.IGNORE) to pominie jednostki NULL. ALE (jak powiedział Augusto) jeśli używasz na przykład Primefaces Datatable i dostajesz 10 wierszy i pomijasz 2, z powodu @NotFound (action = NotFoundAction.IGNORE) w twojej nieruchomości, będziesz miał 10 wierszy, a nie 8 (rzędy duchów).

@NotFound(action=NotFoundAction.IGNORE) 
private Product p; 
Powiązane problemy