2011-11-12 8 views
5

Mi piacerebbe sapere che l'attuazione del metodo di rimozione è meglio:JPA e DAO realizzazione di un'operazione di eliminazione

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

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

Ho letto un sacco di articoli su questo e in quasi ogni uno di loro è simile al primo approccio, che mi sembra del tutto inutile in quanto può essere fatto senza la necessità di recuperare l'intera entità dal database (se non è presente nel contesto di persistenza) e quindi rimuoverla. C'è qualcosa che mi manca e il primo approccio è davvero migliore?

+1

Perché non si chiama 'entityManager.remove (t)'? – stacker

+0

@stacker: voglio questo metodo per rimuovere sia le entità gestite che quelle separate. – VaclavDedik

risposta

1

Si potrebbe verificare se l'entità è gestito invocando

boolean isManaged = entityManager.contains(t); 

Se fosse vero semplicemente chiamare

entityManager.remove(t); 

altrimenti il ​​secondo approccio sembra migliore in quanto la fusione potrebbe causare una maggiore attività db a causa di eager loading (se configurato). Javadoc su getReference dice "Ottieni un'istanza, il cui stato può essere scaricato pigramente." Se l'istanza richiesta non esiste nel database, lancia EntityNotFoundException quando si accede per la prima volta allo stato dell'istanza. (Il runtime del provider di persistenza è autorizzato a lanciare EntityNotFoundException quando getReference (java.lang.Class, java.lang.Object) viene chiamato.) L'applicazione non dovrebbe aspettarsi che lo stato dell'istanza sarà disponibile al momento del distacco, a meno che non sia stato acceduto dall'applicazione mentre il gestore dell'entità era aperto. "

In breve l'entità deve essere gestito therfore, vorrei suggerire:

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

Questa soluzione sembra buona, tuttavia, sarei interessato a sapere che qualcuno ha eseguito qualsiasi misurazione se si esegue una query JPQL/HQL sulla falsariga di "DELETE FROM Entity e WHERE e.id =: id" sarebbe più veloce della chiamata unire e quindi rimuovere, quando l'entità non è contenuta nel gestore? Il sovraccarico di creazione di una query non è necessario per recuperare l'entità? – esaj

+1

Non mi sembra necessario, se l'entità è presente nel contesto di persistenza, invocando em.merge (r) restituisce il riferimento all'entità gestita. Non è di questa domanda. Quello che mi infastidisce è quando l'entità non è presente nel contesto di persistenza. Perché allora il metodo di fusione deve recuperare l'entità dal database, che in questo caso mi sembra non necessario poiché ho solo bisogno di rimuovere una riga dal database. – VaclavDedik

Problemi correlati