Skip to content

Commit

Permalink
Update identityMap when entity gets managed again
Browse files Browse the repository at this point in the history
http://www.doctrine-project.org/jira/browse/DDC-3619

When using SoftDeleteable doctrine extension, an entity can be scheduled
for deletion, then persisted before flushing. In such a case, the entity
was removed from the unit of work identity map and no reference was
hold. This could lead to spl_object_hash collisions, and prevent
another, new entity to be persisted later.

This fix makes sure the unit of work identity map holds a reference to
the entity after it has been soft-deleted.
  • Loading branch information
nclavaud authored and Ocramius committed Mar 17, 2015
1 parent da72f3e commit b492d61
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/Doctrine/ORM/UnitOfWork.php
Original file line number Diff line number Diff line change
Expand Up @@ -1684,6 +1684,7 @@ private function doPersist($entity, array &$visited)
case self::STATE_REMOVED:
// Entity becomes managed again
unset($this->entityDeletions[$oid]);
$this->addToIdentityMap($entity);

$this->entityStates[$oid] = self::STATE_MANAGED;
break;
Expand Down
46 changes: 46 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3619Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace Doctrine\Tests\ORM\Functional\Ticket;

class DDC3619Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
protected function setup()
{
parent::setup();

$this->_schemaTool->createSchema(
array(
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3619Entity'),
)
);
}

public function testIssue()
{
$uow = $this->_em->getUnitOfWork();

$entity = new DDC3619Entity();
$this->_em->persist($entity);
$this->_em->flush();
$this->assertTrue($uow->isInIdentityMap($entity));

$this->_em->remove($entity);
$this->assertFalse($uow->isInIdentityMap($entity));

$this->_em->persist($entity);
$this->assertTrue($uow->isInIdentityMap($entity));
}
}

/**
* @Entity()
*/
class DDC3619Entity
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="IDENTITY")
*/
protected $id;
}

0 comments on commit b492d61

Please sign in to comment.