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.

9voto

Dennis Points 620

Rafraîchir l'entité en question a aidé mon cas.

/* $item->getProduct() is already set */

/* Add these 3 lines anyway */
$id = $item->getProduct()->getId();            
$reference = $this->getDoctrine()->getReference(Product::class, $id);
$item->setProduct($reference);

/* Original code as follows */
$quote->getItems()->add($item);
$this->getDoctrine()->persist($quote);
$this->getDoctrine()->flush();

Malgré mon $item ayant déjà un Product défini ailleurs, je recevais toujours l'erreur.

Il s'avère qu'il a été réglé via un différents exemple de EntityManager .

Donc c'est une sorte de piratage, en récupérant id du produit existant, puis de récupérer une référence de celui-ci, et d'utiliser setProduct pour "rafraîchir" la connexion, quelle qu'elle soit. J'ai ensuite résolu le problème en m'assurant que je n'ai et n'utilise qu'une seule instance de EntityManager dans ma base de code.

0voto

shukshin.ivan Points 431

J'ai eu cette erreur aussi quand j'ai essayé de ajouter un nouveau 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"}).

Mon cas est que j'ai essayé de sauver une entité, qui ne devrait pas être sauvée. Les relations de l'entité ont été remplies et ont essayé d'être sauvegardées ( User a Chat dans Many2Many, mais Chat était une entité temporaire), mais il y a eu quelques collisions.

Donc, si j'utilise cascade={"persist"} J'obtiens un comportement indésirable - l'entité poubelle est sauvegardée. Ma solution a été de supprimer l'entité non sauvegardée de toutes les entités sauvegardées :

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

Code d'épargne

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

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

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