diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 2e610d6406f..61d502dbe5b 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -205,12 +205,13 @@ public function hydrateAll($stmt, $resultSetMapping, array $hints = []) $this->_hints = $hints; $this->_em->getEventManager()->addEventListener([Events::onClear], $this); - $this->prepare(); - $result = $this->hydrateAllData(); - - $this->cleanup(); + try { + $result = $this->hydrateAllData(); + } finally { + $this->cleanup(); + } return $result; } diff --git a/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php index 00aefa398d9..a8fdcb52fac 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php +++ b/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php @@ -10,6 +10,7 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Events; use Doctrine\ORM\Internal\Hydration\AbstractHydrator; +use Doctrine\ORM\NoResultException; use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\Tests\OrmFunctionalTestCase; use PHPUnit_Framework_MockObject_MockObject; @@ -106,4 +107,31 @@ public function testHydrateAllRegistersAndClearsAllAttachedListeners(): void $this->hydrator->hydrateAll($this->mockStatement, $this->mockResultMapping); } + + /** + * @group #DDC-8482 + */ + public function testHydrateAllClearsAllAttachedListenersEvenOnError(): void + { + $this + ->mockEventManager + ->expects(self::at(0)) + ->method('addEventListener') + ->with([Events::onClear], $this->hydrator); + + $this + ->mockEventManager + ->expects(self::at(1)) + ->method('removeEventListener') + ->with([Events::onClear], $this->hydrator); + + $this + ->hydrator + ->expects(self::once()) + ->method('hydrateAllData') + ->willThrowException(new NoResultException()); + + $this->expectException(NoResultException::class); + $this->hydrator->hydrateAll($this->mockStatement, $this->mockResultMapping); + } }