From 2209c5ef30ca0e699e0c28d5330f5ff5339b1dac Mon Sep 17 00:00:00 2001 From: romanb Date: Sat, 20 Mar 2010 09:40:50 +0000 Subject: [PATCH] [2.0][DDC-444] Fixed. --- lib/Doctrine/ORM/UnitOfWork.php | 8 +- .../ORM/Functional/Ticket/DDC444Test.php | 76 +++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC444Test.php diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index e8bb8ce47..d4aff352a 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -519,9 +519,11 @@ class UnitOfWork implements PropertyChangedListener continue; } - // If change tracking is explicit, then only compute changes on explicitly saved entities + // If change tracking is explicit, then only compute changes on explicitly persisted entities $entitiesToProcess = $class->isChangeTrackingDeferredExplicit() ? - $this->_scheduledForDirtyCheck[$className] : $entities; + (isset($this->_scheduledForDirtyCheck[$className]) ? + $this->_scheduledForDirtyCheck[$className] : array()) + : $entities; foreach ($entitiesToProcess as $entity) { // Ignore uninitialized proxy objects @@ -1927,7 +1929,7 @@ class UnitOfWork implements PropertyChangedListener public function scheduleForDirtyCheck($entity) { $rootClassName = $this->_em->getClassMetadata(get_class($entity))->rootEntityName; - $this->_scheduledForDirtyCheck[$rootClassName] = $entity; + $this->_scheduledForDirtyCheck[$rootClassName][] = $entity; } /** diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC444Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC444Test.php new file mode 100644 index 000000000..4257c7376 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC444Test.php @@ -0,0 +1,76 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC444User'), + )); + } + + public function testExplicitPolicy() + { + $classname = __NAMESPACE__ . "\DDC444User"; + + $u = new $classname; + $u->name = "Initial value"; + + $this->_em->persist($u); + $this->_em->flush(); + $this->_em->clear(); + + $q = $this->_em->createQuery("SELECT u FROM $classname u"); + $u = $q->getSingleResult(); + $this->assertEquals("Initial value", $u->name); + + $u->name = "Modified value"; + + // This should be NOOP as the change hasn't been persisted + $this->_em->flush(); + $this->_em->clear(); + + + $u = $this->_em->createQuery("SELECT u FROM $classname u"); + $u = $q->getSingleResult(); + + $this->assertEquals("Initial value", $u->name); + + + $u->name = "Modified value"; + $this->_em->persist($u); + // Now we however persisted it, and this should have updated our friend + $this->_em->flush(); + + $q = $this->_em->createQuery("SELECT u FROM $classname u"); + $u = $q->getSingleResult(); + + $this->assertEquals("Modified value", $u->name); + } +} + + +/** + * @Entity @Table(name="ddc444") + * @ChangeTrackingPolicy("DEFERRED_EXPLICIT") + */ +class DDC444User +{ + /** + * @Id @Column(name="id", type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @Column(name="name", type="string") + */ + public $name; +} + +