diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 24f05748d..356ea02b2 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -2477,17 +2477,23 @@ class UnitOfWork implements PropertyChangedListener if ($entity instanceof NotifyPropertyChanged) { $entity->addPropertyChangedListener($this); } + + // inject ObjectManager into just loaded proxies. + if ($overrideLocalValues && $entity instanceof ObjectManagerAware) { + $entity->injectObjectManager($this->em, $class); + } + } else { $overrideLocalValues = isset($hints[Query::HINT_REFRESH]); // If only a specific entity is set to refresh, check that it's the one if(isset($hints[Query::HINT_REFRESH_ENTITY])) { $overrideLocalValues = $hints[Query::HINT_REFRESH_ENTITY] === $entity; + } - // inject ObjectManager into just loaded proxies. - if ($overrideLocalValues && $entity instanceof ObjectManagerAware) { - $entity->injectObjectManager($this->em, $class); - } + // inject ObjectManager upon refresh. + if ($overrideLocalValues && $entity instanceof ObjectManagerAware) { + $entity->injectObjectManager($this->em, $class); } } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2231Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2231Test.php new file mode 100644 index 000000000..b222e0218 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2231Test.php @@ -0,0 +1,71 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2231EntityY'), + )); + } + + public function testInjectObjectManagerInProxyIfInitializedInUow() + { + $y1 = new DDC2231EntityY; + + $this->_em->persist($y1); + + $this->_em->flush(); + $this->_em->clear(); + + $y1ref = $this->_em->getReference(get_class($y1), $y1->id); + + $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $y1ref); + $this->assertFalse($y1ref->__isInitialized__); + + $id = $y1ref->doSomething(); + + $this->assertTrue($y1ref->__isInitialized__); + $this->assertEquals($this->_em, $y1ref->om); + } +} + + +/** @Entity @Table(name="ddc2231_y") */ +class DDC2231EntityY implements ObjectManagerAware +{ + /** + * @Id @Column(type="integer") @GeneratedValue + */ + public $id; + + public $om; + + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + $this->om = $objectManager; + } + + public function getId() + { + return $this->id; + } + + public function doSomething() + { + } +}