2011-12-16 17 views
5

La documentazione per EntityManager.persist() dice che sarà .EntityManager.contains() restituisce false dopo persist()

Sta persistendo l'entità nel database, ma quando chiamo il metodo EntityManager.contains() per verificare se l'entità che ho appena persistito è gestita restituisce false.

Voglio solo sapere perché succede? Forse ci sono qualcosa che non ero in grado di fare o qualcosa che ho trascurato?

suggerimento sarebbe apprezzato: D

+1

Puoi pubblicare il tuo codice in cui persisti e leggi i contenuti di EntityManager? –

risposta

3

Questo è davvero strano. Secondo la la Sun EJB3 spec:

Procedimento può essere utilizzato per determinare se un'entità istanza è gestito nel contesto di persistenza corrente.

Il metodo contains restituisce true:

  • Se l'entità è stato recuperato dal database, e non è stato rimosso o staccato.
  • Se l'istanza dell'entità è nuova e il metodo persist è stato chiamato sull'entità o l'operazione di permanenza è stata collegata in cascata ad essa.

Il metodo contains restituisce false:

  • Se l'istanza è staccato.
  • Se il metodo remove è stato chiamato sull'entità o l'operazione di rimozione è stata collegata in cascata ad essa.
  • Se l'istanza è nuova e il metodo persist non è stato chiamato sull'entità o l'operazione persist non è stata concatenata a .

nota che l'effetto della cascata di persistere o rimuovere è immediatamente visibile al metodo contiene, mentre l'inserimento effettivo o soppressione della rappresentazione database per l'entità può essere differito fino alla fine della transazione .

Stai chiamando contains nella stessa transazione?

+0

Credo di essere nella stessa transazione ma non sono sicuro perché non sto definendo il punto in cui la transazione dovrebbe iniziare e commetterlo perché l'ho lasciato al contenitore. Ma penso che il motivo per cui non ottengo l'entità persistente sia a causa della chiave primaria. Una delle chiavi primarie dovrebbe provenire dal database e non posso recuperarla. Ad ogni modo, cercherò semplicemente un approccio diverso per ottenere questo risultato. Grazie per le informazioni però: D –

0

abbiamo fatto qualche soluzione alternativa, piuttosto che persistendo> aggiornando, abbiamo appena preso la chiave autogenerata dal datastore e assegnata manualmente ai campi chiave dell'entità e quindi mantenuta.

Problemi correlati