2013-04-18 21 views
6

Przez chwilę się zastanawiałem się, dlaczego podczas używania JPA, muszę napisać moje delegować metody tak:Podczas korzystania z menedżera encji JPA, dlaczego musisz scalić przed usunięciem?

@Transactional 
public void delete(Account account) 
{ 
    if (entityManager.contains(account)) 
    { 
     entityManager.remove(account); 
    } 
    else 
    { 
     entityManager.remove(entityManager.merge(account)); 
    } 
} 

Być może zawiera nie jest potrzebna, ponieważ transakcja zaczyna się i kończy z tej metody, ale wciąż zastanawiam się, dlaczego usunięcie nie mogło po prostu wziąć niezarządzanego obiektu. Czy to dlatego, że trzeba nim zarządzać, aby wiedzieć, jaki jest identyfikator tego obiektu? Wszelkie inne spostrzeżenia byłyby świetne do usłyszenia. Chcę tylko zrozumieć, jak hows i wady z WZP usunąć.

Odpowiedz

10

Operacja usunięcia może być kaskadowana do powiązań jednostki.

Aby móc wiedzieć, które jednostki stowarzyszone usunąć, menedżer encji nie może polegać na odłączonej jednostce, ponieważ z definicji ten odłączony podmiot nie odzwierciedla najnowszego stanu jednostki i nie koniecznie wszystkie rekordy obciążane są kaskadowo.

Więc jeśli to przyjął wolnostojący podmiot, remove() musiałby zadecydować dla Ciebie: albo scalić wolnostojący podmiot i wykonać operację usuń oparciu o to, co wolnostojąca jednostka zawiera, lub po prostu załadować podmiot mający ten sam identyfikator jako oddzielona jednostka i wykonać operację na podstawie załadowanego obiektu.

Zamiast wybierać dla ciebie, po prostu wymaga dołączonego obiektu. W ten sposób decydujesz, czego chcesz.

+1

To ma sens. Dziękuję za udostępnienie. – testing123