Skip to content

Loading…

DDC-2317: [UnitOfWork] Entity in identityMap but not present in entityIdentifiers #3021

Closed
doctrinebot opened this Issue · 6 comments

2 participants

@doctrinebot

Jira issue originally created by user rpiotaix:

I'm using symfony 2.1.8 and sonata/admin-bundle
I have a quite complex entity mapping.

  • A Competence has many CompetenceAction (superclass)
  • CompetenceActionBuff is a subclass of CompetenceAction and has exactly one buff (selectable in the form by an 'entity' field).

When i want to edit a Competence, i have the following error message about the Buff entity linked to the CompetenceActionBuff:
"Entities passed to the choice field must be managed. [...]"
The exception is raised in Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php at line 412

I've added some debug code in the EntityManager::contains() method and it shows that my entity is in the entityMap but his oid is not in the keys of entityIdentifiers making the call to UnitOfWork::isInIdentityMap() return false at line 1505.

When submitting the form, there is no problems. All the entities are correctly created in the database. The exception is thrown only when i want to edit the Competence object. Saying that the Buff object is not managed when it was first loaded from the database... strange, no?

Finally, i tried to comment the test
if (!$this->em->contains($entity))) in EntityChoiceList::getIdentifierValues() and everything seemed to work properly.

@doctrinebot

Comment created by @ocramius:

Can you please reproduce this in an insulated environment (without symfony forms involved)?

@doctrinebot

Comment created by rpiotaix:

By doing this, all work properly, the exception is not thrown:

```$competence = $this->getRepo(\Sistearth\JeuBundle\Entity\Competence\Competence::REPO)->find(1);
$buff = $competence->getActions()[0]->getBuff();

$em = $this->getDoctrine()->getEntityManager();

if(!$em->contains($buff))
throw new \Exception("Not in EntityManager");


but if i add this after:

$form = $this->createForm(new \Sistearth\JeuBundle\Form\Competence\CompetenceType(), $competence);


then, the exception "Entities passed to the choice field must be managed. Maybe persist them in the entity manager?" is back.

I'll try to do some others tests...
@doctrinebot

Comment created by @ocramius:

[~rpiotaix] the problem is exactly the last bit :) Doctrine has no forms, so you will have to create a small script that reproduces the problem without symfony, starting from:

php composer.phar require doctrine/orm:dev-master@dev

@doctrinebot

Comment created by rpiotaix:

Bug found!

In the form type CompetenceActionBuffType, i marked the field buff with array('by*reference"=>false). If byreference is set to false, the modelData is cloned (here the Buff proxy) at line 349 in Form.php.
And, by cloning the object, the spl
object*hash of the clone is different from the original one's.

Is this a symfony Form component bug or a doctrine one?

@doctrinebot

Comment created by @ocramius:

[~rpiotaix] this is a problem of symfony forms, please report it on the symfony issue tracker (check if there's a similar open issue first) at https://github.com/symfony/symfony/issues/

@doctrinebot

Issue was closed with resolution "Invalid"

@Ocramius Ocramius was assigned by doctrinebot
@doctrinebot doctrinebot closed this
@doctrinebot doctrinebot added the Bug label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.