diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 5ad54e83c..8c8169c90 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -925,12 +925,13 @@ class UnitOfWork implements PropertyChangedListener } if ($changeSet) { - $this->entityChangeSets[$oid] = (isset($this->entityChangeSets[$oid])) - ? array_merge($this->entityChangeSets[$oid], $changeSet) - : $changeSet; - + if (isset($this->entityChangeSets[$oid])) { + $this->entityChangeSets[$oid] = array_merge($this->entityChangeSets[$oid], $changeSet); + } else if ( ! isset($this->entityInsertions[$oid])) { + $this->entityChangeSets[$oid] = $changeSet; + $this->entityUpdates[$oid] = $entity; + } $this->originalEntityData[$oid] = $actualData; - $this->entityUpdates[$oid] = $entity; } } @@ -2499,7 +2500,7 @@ class UnitOfWork implements PropertyChangedListener $id = array($class->identifier[0] => $id); } - + $idHash = implode(' ', $id); if (isset($this->identityMap[$class->rootEntityName][$idHash])) { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3160Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3160Test.php new file mode 100644 index 000000000..c0ed69dd0 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3160Test.php @@ -0,0 +1,70 @@ +useModelSet('cms'); + parent::setUp(); + } + + /** + * @group DDC-3160 + */ + public function testNoUpdateOnInsert() + { + $listener = new DDC3160OnFlushListener(); + $this->_em->getEventManager()->addEventListener(Events::onFlush, $listener); + + $user = new CmsUser; + $user->username = 'romanb'; + $user->name = 'Roman'; + $user->status = 'Dev'; + + $this->_em->persist($user); + $this->_em->flush(); + + $this->_em->refresh($user); + + $this->assertEquals('romanc', $user->username); + $this->assertEquals(1, $listener->inserts); + $this->assertEquals(0, $listener->updates); + } +} + +class DDC3160OnFlushListener +{ + public $inserts = 0; + public $updates = 0; + + public function onFlush(OnFlushEventArgs $args) + { + $em = $args->getEntityManager(); + $uow = $em->getUnitOfWork(); + + foreach ($uow->getScheduledEntityInsertions() as $entity) { + $this->inserts++; + if ($entity instanceof CmsUser) { + $entity->username = 'romanc'; + $cm = $em->getClassMetadata(get_class($entity)); + $uow->recomputeSingleEntityChangeSet($cm, $entity); + } + } + + foreach ($uow->getScheduledEntityUpdates() as $entity) { + $this->updates++; + } + } +} +