89 votes

Doctrine - Une nouvelle entité a été trouvée par le biais de la relation

Depuis deux semaines, nous avons ce problème lorsque nous essayons d'extraire de nouveaux éléments :

CRITIQUE : Doctrine \ORM\ORMInvalidArgumentException :

Une nouvelle entité a été trouvée par la relation 'Comment#capture' qui n'a pas été configurée pour cascader les opérations de persistance pour l'entité.

Mais le capture est déjà dans la base de données, et nous l'obtenons par un findOneBy donc si nous le persistons en cascade, ou le persistons, nous obtenons une

Violation d'une contrainte de table : entrée en double.

Les commentaires sont créés dans une boucle avec différentes captures, avec un nouveau, et tous les champs obligatoires sont définis.

Avec toutes les entités persistées et / ou obtenues par une findOne (et toutes valides), le flush échoue toujours.

Je suis sur ce problème depuis un moment, alors aidez-moi s'il vous plaît.

62voto

Mirza Selimovic Points 145

J'ai eu le même problème et c'était le même EntityManager . Je voulais insérer un objet lié ManyToOne . Et je ne veux pas cascade persist .

Exemple :

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

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

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

Cela déclenche la même exception pour moi.

La solution est donc :

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

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

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

49voto

ownking Points 730

Dans mon cas, un appel trop précoce de

$this->entityManager->clear();

a causé le problème. Il a également disparu en ne faisant qu'un effacement sur l'objet récent, par exemple

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

47voto

drakonli Points 1176

Ma réponse est pertinente pour le sujet, mais pas très pertinente pour votre cas particulier, donc pour ceux qui cherchent, je poste ceci, car les réponses ci-dessus ne m'ont pas aidé.

Dans mon cas, j'ai eu la même erreur avec le traitement par lots d'entités qui avaient une relation et cette relation était définie sur la même entité.

CE QUE J'AI FAIT DE MAL :

Quand j'ai fait $this->entityManager->clear(); lors du traitement d'un lot d'entités, j'obtiendrais cette erreur, car le lot suivant d'entités pointerait vers l'entité connexe détachée.

CE QUI A MAL TOURNÉ :

  1. Je ne savais pas que $this->entityManager->clear(); fonctionne de la même manière que $this->entityManager->detach($entity); ne détache que TOUTES les entités du dépôt.

  2. Je pensais que $this->entityManager->clear(); détache également les entités liées.

CE QUE J'AURAIS DÛ FAIRE :

J'aurais dû itérer sur les entités et les détacher une par une - cela n'aurait pas détaché l'entité connexe vers laquelle pointaient les futures entités.

J'espère que cela aidera quelqu'un.

11voto

Damien Points 3590

Tout d'abord, vous devriez faire plus attention à votre code, je vois comme 3 indentations différentes dans votre entité et votre contrôleur - c'est difficile à lire, et ne correspond pas à l'esprit de l'entreprise. Normes de codage Symfony2 .

Le code vous montrez pour votre contrôleur n'est pas complète, nous n'avons aucune idée d'où $this->activeCapture arrive. A l'intérieur, vous avez un $people['capture'] qui contient un Capture objet je présume. C'est très important.

Si la capture en $people['capture'] est persisté / récupéré à partir d'un autre EntityManager que $this->entityManager (dont, encore une fois, nous ne savons pas d'où il provient), Doctrine2 n'a aucune idée que l'objet est déjà persistant.

Vous devez vous assurer d'utiliser la même instance du gestionnaire d'entités Doctrine pour toutes ces opérations (utilisez la fonction spl_object_hash sur l'objet EM pour s'assurer qu'il s'agit de la même instance).

Vous pouvez également indiquer à l'EntityManager ce qu'il doit faire avec l'objet 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 cela ne vous aide pas, vous devez fournir plus de code.

10voto

Roberto Points 393

L'erreur : 'Comment#capture' qui n'a pas été configurée pour cascader les opérations de persistance pour l'entité.

Le problème :

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

ne pas configurer la cascade persiste

essayez avec ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X