2012-02-18 7 views
13

Cosa sta succedendo qui?L'entità deve essere gestita per chiamare rimuovere

@Stateless 
@LocalBean 
public class AppointmentCommentDao { 
    public void delete(long appointmentCommentId) { 
     AppointmentComment ac = em.find(AppointmentComment.class, appointmentCommentId); 
     if (ac != null) 
     { 
      em.merge(ac); 
      em.remove(ac); 
     } 
    } 
    @PersistenceContext 
    private EntityManager em; 
} 

Sulla chiamata a remove ottengo una IllegalArgumentException con il messaggio di essere Entity must be managed to call remove: ...., try merging the detached and try the remove again.

+0

risolto con il metodo em.find (...). –

risposta

18

Nel tuo caso unione non è necessaria, perché AC non è deattached in qualsiasi punto tra em.find e em .remove.

In generale, quando un'entità è deattached, il metodo di EntityManager unire prende entità come argomento e ritorna gestito esempio. L'entità data come argomento non si trasforma per essere allegata. Questo è spiegato ad esempio qui: EntityManager.merge. Bisogna andare per:

AppointmentComment toBeRemoved = em.merge(ac); 
    em.remove(toBeRemoved); 
+0

Strano ... Senza modifiche a quel codice (anche se c'erano altre modifiche non correlate), ha iniziato misteriosamente a funzionare. Ho persino rimosso completamente la fusione perché l'intera ragione per cui l'ho avuto è stata che stavo ottenendo quell'eccezione. Non dovrebbe essere necessario perché l'entità dovrebbe essere collegata mentre ci troviamo nello stesso contesto di persistenza che l'ha caricata. Qualcos'altro stava succedendo penso. Stupid GlassFish. –

+0

Prendo il tuo punto, tuttavia, che devi utilizzare l'oggetto restituito dall'unione in avanti, non l'oggetto passato. +1 –

+0

Hai perfettamente ragione, il tuo codice dovrebbe funzionare senza unire, perché ac non è deattached in nessun punto. Per prima cosa ho pensato che fosse un esempio semplicistico. Aggiornerò la risposta –

6

Prova questa:

entity = getEntityManager().getReference(AppointmentComment.class, entity.getId()); 
getEntityManager().remove(entity);