Doctrina – Se encontró una nueva entidad a través de la relación

desde hace 2 semanas, estamos teniendo este problema al intentar eliminar nuevos elementos:

CRÍTICO: Doctrine \ ORM \ ORMInvalidArgumentException:

Se encontró una nueva entidad a través de la relación ‘Captura del comentario #’ que no estaba configurada para continuar operaciones en cascada para la entidad

Pero la capture ya está en la base de datos, y la estamos obteniendo mediante un findOneBy , de modo que si lo continuamos en cascada o lo persistimos, obtenemos un

Violación de restricción de tabla: entrada duplicada.

Los comentarios se crean en un bucle con diferentes capturas, con un nuevo y se establecen todos los campos obligatorios.

Con todas las entidades persistentes y / o findOne por un findOne (y todas válidas), el enjuague sigue fallando.

Estoy en este tema desde hace un tiempo, así que por favor ayudame

Tuve el mismo problema y era el mismo EntityManager . Quería insertar un objeto relacionado con ManyToOne . Y no quiero que persist una cascade .

Ejemplo:

 $category = $em->find("Category", 10); $product = new Product(); $product->setCategory($category) $em->persist($product); $em->flush(); 

Esto arroja la misma excepción para mí.

Entonces la solución es:

 $category = $em->find("Category", 10); $product = new Product(); $product->setCategory($category) $em->merge($product); $em->flush(); 

En mi caso, una llamada demasiado temprana de

 $this->entityManager->clear(); 

causó el problema También desapareció al hacer un claro sobre el objeto reciente, como

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

Mi respuesta es relevante para el tema, pero no es muy relevante para su caso particular, por lo que para aquellos que usan Google lo publico, ya que las respuestas anteriores no me ayudaron.

En mi caso, tuve el mismo error con las entidades de procesamiento por lotes que tenían una relación y esa relación se estableció en la misma entidad.

QUE HICE MAL:

Cuando hice $this->entityManager->clear(); al procesar el lote de entidades obtendría este error, porque el próximo lote de entidades apuntaría a la entidad relacionada separada.

QUÉ SALIÓ MAL:

  1. No sabía que $this->entityManager->clear(); funciona igual que $this->entityManager->detach($entity); solo separa TODAS las entidades del repository.

  2. Pensé que $this->entityManager->clear(); también separa entidades relacionadas.

LO QUE DEBERÍA HABER HECHO:

Debería haber iterado sobre entidades y separarlas una a una, eso no separaría la entidad relacionada a la que apuntaban las entidades futuras.

Espero que esto ayude a alguien.

En primer lugar, debe cuidar mejor su código, veo como 3 diferentes indentaciones en su entidad y controlador: esto es difícil de leer y no se ajusta a los estándares de encoding Symfony2 .

El código que muestra para su controlador no está completo, no tenemos idea de dónde está llegando $this->activeCapture . Dentro tienes un $people['capture'] que contiene un objeto Capture , supongo. Esto es muy importante.

Si la captura en $people['capture'] se persiste / recupera desde otro EntityManager que $this->entityManager (que, de nuevo, no sabemos de dónde viene), Doctrine2 no tiene idea de que el objeto ya se ha conservado.

Debe asegurarse de usar la misma instancia de Doctrine Entity Manager para todas esas operaciones (use spl_object_hash en el objeto EM para asegurarse de que son la misma instancia).

También puede decirle al EntityManager qué hacer con el objeto Capture.

 // 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); 

Si esto no ayuda, debe proporcionar más código.

El error: ‘Comentario # captura’ que no se configuró para continuar operaciones en cascada para la entidad

El problema:

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

no configuró la cascada persistir

prueba con esto:

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

También recibí este error cuando intenté agregar una nueva entidad.

 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"}). 

Mi caso fue que intenté guardar la entidad, que no debería guardarse. Las relaciones de entidad se llenaron e intentaron salvarse (el User tiene chateo en Many2Many, pero Chat era una entidad temporal), pero hubo algunas colisiones.

Entonces, si uso cascade={"persist"} , obtengo un comportamiento no deseado – la entidad de la papelera se guarda. Mi solución fue eliminar la entidad que no guarda de todas las entidades de ahorro:

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

Código de guardado

 /* some code witch $chat entity */ $chat->addUser($user); // saving $user->removeFromChats($chat); $this->getEntityManager()->persist($user); $this->getEntityManager()->flush();