2013-04-18 12 views
6

Per un po 'di tempo mi sono chiesto il motivo per cui quando si utilizza JPA, devo scrivere i miei metodi di eliminazione come questa:Quando si utilizza entityManager JPA, perché è necessario unire prima di rimuovere?

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

Forse la contiene non è necessaria in quanto l'operazione inizia e finisce con questo metodo, ma mi chiedo ancora perché la rimozione non possa semplicemente prendere un oggetto non gestito. È perché ha bisogno di essere gestito per sapere qual è l'id per quell'oggetto? Qualsiasi altro approfondimento sarebbe bello da sentire. Voglio solo capire come e perché rimuovere il JPA.

risposta

10

L'operazione di rimozione può essere collegata in cascata alle associazioni di un'entità.

Per essere in grado di sapere quali entità associate rimuovere, il gestore di entità non può fare affidamento su un'entità distaccata, poiché, per definizione, questa entità distaccata non riflette lo stato più recente dell'entità e non necessariamente ha caricato tutte le sue associazioni in cascata in modo ricorsivo.

Quindi, se ha accettato un'entità indipendente, remove() dovrebbe decidere per voi: o unire l'entità distaccata ed eseguire l'operazione di rimozione in base a ciò l'entità distaccata contiene, o semplicemente caricare il soggetto che abbia lo stesso ID come entità distaccata ed eseguire l'operazione in base all'entità caricata.

Invece di decidere per te, richiede semplicemente un'entità allegata. In questo modo, decidi cosa vuoi.

+1

Questo ha senso. Grazie per la condivisione. – testing123

Problemi correlati