2013-08-13 1 views
44

da 2 settimane, stiamo avendo questo problema durante il tentativo di stanare nuovi elementi:Dottrina - Una nuova entità è stata trovata attraverso il rapporto

CRITICAL: Doctrine\ORM\ORMInvalidArgumentException:

A new entity was found through the relationship 'Comment#capture' that was not configured to cascade persist operations for entity

Ma la capture è già nel database, e stiamo ottenendo è da un findOneBy, quindi se ci ostiniamo a cascata, o persistono, otteniamo un

Table constraint violation: duplicate entry.

I commenti vengono creati in un ciclo con differenti cattura, con una nuova, e tutti i campi obbligatori sono impostati.

Con tutte le entità persistenti e/o ottenute da un findOne (e tutte valide), lo svuotamento non riesce ancora.

Sono su questo tema da un po ', quindi per favore mi aiuti

+2

Mostraci del codice, ad esempio il controller e le entità. – cheesemacfly

+0

Questo è un problema correlato, potrebbe aiutarti: http://stackoverflow.com/questions/18171801/doctrine-entities-relationship – Flip

+0

Ecco il codice dal controller: http://pastebin.com/J0Keukfy, e qui sono i campi del commento Entity: http: // pastebin.com/nG4rE1Pp – isundil

risposta

9

Prima di tutto, si dovrebbe prendersi più cura del proprio codice, vedo come 3 differenti rientranze nel vostro soggetto e il controller - questo è difficile leggere e non si adattano allo Symfony2 coding standards.

Il codice you show per il controller non è completo, non abbiamo idea da dove arriverà lo $this->activeCapture. Dentro hai un $people['capture'] che contiene un oggetto Capture che presumo. Questo è molto importante.

Se la cattura in $people['capture'] viene mantenuto/recuperati da un'altra EntityManager di $this->entityManager (che, ancora una volta, non sappiamo da dove è venuto), Doctrine2 non hanno idea che l'oggetto è già persistente.

È necessario assicurarsi di utilizzare la stessa istanza di Doctrine Entity Manager per tutte quelle operazioni (utilizzare spl_object_hash sull'oggetto EM per assicurarsi che siano la stessa istanza).

È anche possibile indicare a EntityManager cosa fare con l'oggetto Cattura.

// Refreshes the persistent state of an entity from the database 
$this->entityManager->refresh($captureEntity); 

// Or 
// Merges the state of a detached entity into the 
// persistence context of this EntityManager and returns the managed copy of the entity. 
$captureEntity = $this->entityManager->merge($captureEntity); 

Se questo non aiuta, è necessario fornire più codice.

+0

Ho provato ad aggiornare tutte le entità activeCapture che ho, ma nulla ... Sono sicuro di avere un solo EntityManager perché uso "get ('doctrine.orm.default_entity_manager')". Il $ this-> activeCapture è disponibile qui: http://pastebin.com/px0cyWs0 e getActiveCapture qui: http://pastebin.com/D0LRW2TD – isundil

+0

Perché stai staccando la linea Capture 36 di http://pastebin.com/ px0cyWs0? Se la cattura viene referenziata da qualche parte, Doctrine non ne sa più nulla e quindi può lanciare il tipo di eccezione che hai ottenuto. – Damien

+0

Questo processo ci permette di aggiornare le entità catturanti, ma questa funzione stampa i log, e non viene chiamata (non viene stampato alcun debug) – isundil

3

L'errore: 'Il commento # capture' che non è stato configurato in modo da cascata persistere operazioni per l'entità

Il problema:

/** 
* @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments") 
* @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true) 
*/ 
protected $capture; 

dont configurato la cascata persistono

prova con questo:

/** 
* @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments", cascade={"persist", "remove" }) 
* @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true) 
*/ 
protected $capture; 
34

Nel mio caso una chiamata troppo presto di

causato il problema. E 'anche scomparso da solo facendo un chiaro sull'oggetto recente, come

$this->entityManager->clear($capture); 
38

Ho avuto lo stesso problema ed è stato lo stesso EntityManager. Volevo inserire un oggetto correlato ManyToOne. E non voglio un cascadepersist.

Esempio:

$category = $em->find("Category", 10); 

$product = new Product(); 
$product->setCategory($category) 

$em->persist($product); 
$em->flush(); 

Questo getta la stessa eccezione per me.

Quindi la soluzione è:

$category = $em->find("Category", 10); 

$product = new Product(); 
$product->setCategory($category) 

$em->merge($product); 
$em->flush(); 
+3

sta funzionando. Ma perché? –

+3

Unisci consente a Doctrine di trovare un prodotto $ esistente con lo stesso ID (chiamiamolo $ originalProduct) e unire $ product con $ originalProduct. Si noti che questo ha l'effetto collaterale che tutte le proprietà di $ prodotto verranno copiate in $ originalProduct. Fonte: http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html La semantica dell'operazione di unione, applicata a un'entità X, è la seguente: Se X è un'entità distaccata, lo stato di X viene copiato su un'istanza di entità gestita X preesistente della stessa identità. –

+3

La soluzione ha funzionato anche per me, ma non ne sono veramente soddisfatto. Penso che ci debba essere qualcosa che sto sbagliando da qualche parte (magari in qualche file di configurazione) che causa questo. Non ho mai avuto questo problema su un altro progetto. –

1

ho ottenuto questo errore anche quando ha cercato di aggiungere nuovi entità.

A new entity was found through the relationship 'Application\Entity\User#chats' 
that was not configured to cascade persist operations for entity: ###. 
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or 
configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). 

Il mio caso è stato il tentativo di salvare entità, che non dovrebbe essere salvato. Le relazioni tra entità sono state completate e hanno cercato di essere salvate (User ha Chat in Many2Many, ma la chat era un'entità temporanea), ma c'erano alcune collisioni.

Quindi, se utilizzo cascade={"persist"}, si verifica un comportamento indesiderato: l'entità cestino viene salvata. La mia soluzione era quella di rimuovere le entità non-risparmio di qualsiasi entità risparmio:

// User entity code 
public function removeFromChats(Chat $c = null){ 
    if ($c and $this->chats->contains($c)) { 
     $this->chats->removeElement($c); 
    } 
} 

codice di salvataggio

/* some code witch $chat entity */ 
$chat->addUser($user); 

// saving 
$user->removeFromChats($chat); 
$this->getEntityManager()->persist($user); 
$this->getEntityManager()->flush(); 
+0

Ehi ha già detto che l'entità è presente nel database, quindi la tua risposta non ha alcun senso per quanto riguarda questa domanda. – Vivek

+0

@Vivek Bene, ho trovato questa pagina via google come la più relativa all'errore che ho ottenuto, quindi ho dovuto trovare una soluzione da solo e finalmente l'ho lasciato qui per aiutare gli altri con lo stesso errore. Mi dispiace se non è conveniente per te. –

15

La mia risposta è rilevante per argomento, ma non molto rilevante per il vostro caso particolare, quindi per quelli che googling pubblico questo, come le risposte di cui sopra non mi aiutano.

Nel mio caso, ho avuto lo stesso errore con le entità di elaborazione batch che avevano una relazione e quella relazione era impostata sulla stessa entità.

cosa ho sbagliato:

Quando ho fatto $this->entityManager->clear(); durante l'elaborazione in batch di entità vorrei ottenere questo errore, perché la prossima partita di entità indicherebbe l'entità correlate distaccata.

cosa è andato storto:

  1. non sapevo che $this->entityManager->clear(); funziona allo stesso modo $this->entityManager->detach($entity); stacca solo tutte le entità repositorie`s.

  2. Ho pensato che $this->entityManager->clear(); stacchi anche le entità correlate.

COSA avrei dovuto fare:

avrei iterata entità e staccare uno per uno - che non sarebbe staccare la relativa entità che le entità futuri indicavano.

Spero che questo aiuti qualcuno.

+0

Non l'avrei mai trovato da solo, ottima risposta, grazie! – Hammerbot