Update identityMap when entity gets managed again
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.
This commit is contained in:
parent
18c873216b
commit
bac6570af1
@ -1630,6 +1630,7 @@ class UnitOfWork implements PropertyChangedListener
|
|||||||
case self::STATE_REMOVED:
|
case self::STATE_REMOVED:
|
||||||
// Entity becomes managed again
|
// Entity becomes managed again
|
||||||
unset($this->entityDeletions[$oid]);
|
unset($this->entityDeletions[$oid]);
|
||||||
|
$this->addToIdentityMap($entity);
|
||||||
|
|
||||||
$this->entityStates[$oid] = self::STATE_MANAGED;
|
$this->entityStates[$oid] = self::STATE_MANAGED;
|
||||||
break;
|
break;
|
||||||
|
46
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3619Test.php
Normal file
46
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3619Test.php
Normal file
@ -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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user