2011-11-12 14 views
5

Chciałbym wiedzieć, których wdrożenie metody Usuń jest lepsze:JPA i DAO realizacja operacji usuwania

public void remove(T t) { 
    entityManager.remove(entityManager.merge(t)); 
} 

public void remove(PK pk) { 
    entityManager.remove(entityManager.getReference(entityType, pk)); 
} 

czytałem sporo artykułów na ten temat, aw prawie każdym z nich Jest to podobne do pierwszego podejścia, które wydaje mi się zupełnie niepotrzebne, ponieważ można to zrobić bez potrzeby pobierania całego obiektu z bazy danych (jeśli nie ma go w kontekście utrwalania), a następnie go usunąć. Czy jest coś, czego mi brakuje, a pierwsze podejście jest naprawdę lepsze?

+1

Dlaczego nie nazwać 'entityManager.remove (t)'? – stacker

+0

@stacker: Chcę, aby ta metoda usuwała zarówno zarządzane, jak i odłączone encje. – VaclavDedik

Odpowiedz

1

Można sprawdzić, czy podmiot jest zarządzany przez wywoływanie

boolean isManaged = entityManager.contains(t); 

jeśli prawda wystarczy zadzwonić

entityManager.remove(t); 

inaczej twoje drugie podejście wydaje się lepsze od połączenia może spowodować aktywność bardziej db powodu chętny załadunku (jeśli skonfigurowany). Jawadok na getReference mówi: "Uzyskaj instancję, której stan może być leniwie pobrany.Jeśli żądana instancja nie istnieje w bazie danych, generuje EntityNotFoundException po pierwszym uzyskaniu dostępu do instancji (Środowisko wykonawcze dostawcy utrwalacza może wywołać EntityNotFoundException, gdy getReference (java.lang.Class, java.lang.Object) jest wywoływana.) Aplikacja nie powinna oczekiwać, że stan instancji będzie dostępny po odłączeniu, chyba że aplikacja uzyskała do niego dostęp, podczas gdy menedżer encji był otwarty. "

W skrócie jednostka ma być zarządzany therfore, chciałbym zaproponować:

em.remove(em.contains(r) ? r : em.merge(r)); 
+0

To rozwiązanie wydaje się dobre, jednak chciałbym wiedzieć, czy ktokolwiek wykonał jakiekolwiek pomiary, jeśli wykonanie zapytania JPQL/HQL-a według linii "DELETE FROM Entity e WHERE e.id =: id" byłoby szybsze niż wywołanie scalać, a następnie usuwać, gdy podmiot nie jest zawarty w menedżerze? Czy koszty związane z budowaniem zapytania nie są konieczne, aby pobrać encję? – esaj

+1

Wydaje mi się niepotrzebne, jeśli encja jest obecna w kontekście utrwalania, wywołanie em.merge (r) zwraca odwołanie do zarządzanego obiektu. Nie o to chodzi w tym pytaniu. Martwi mnie to, gdy jednostka nie jest obecna w kontekście utrwalania, ponieważ wtedy metoda scalania musi pobrać encję z bazy danych, co w tym przypadku wydaje mi się zbędne, ponieważ wystarczy usunąć wiersz z bazy danych. – VaclavDedik