From ce76688865cee24419daa2708cfce47fb22ed29d Mon Sep 17 00:00:00 2001 From: Tim Lieberman Date: Wed, 22 Aug 2018 11:49:47 -0700 Subject: [PATCH] Fix for BC break #7366 when calling EM::find() with LockMode::OPTIMISTIC outside of a TX --- lib/Doctrine/ORM/EntityManager.php | 2 +- .../ORM/Functional/Ticket/GH7366Test.php | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/GH7366Test.php diff --git a/lib/Doctrine/ORM/EntityManager.php b/lib/Doctrine/ORM/EntityManager.php index 1754032ae2..c06db61a7d 100644 --- a/lib/Doctrine/ORM/EntityManager.php +++ b/lib/Doctrine/ORM/EntityManager.php @@ -904,7 +904,7 @@ private function checkLockRequirements(int $lockMode, ClassMetadata $class) : vo if (! $class->isVersioned()) { throw OptimisticLockException::notVersioned($class->getClassName()); } - // Intentional fallthrough + break; case LockMode::PESSIMISTIC_READ: case LockMode::PESSIMISTIC_WRITE: if (! $this->getConnection()->isTransactionActive()) { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7366Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7366Test.php new file mode 100644 index 0000000000..a7abd70ac7 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7366Test.php @@ -0,0 +1,78 @@ +setUpEntitySchema( + [ + GH7366Entity::class, + ] + ); + + $this->em->persist(new GH7366Entity('baz')); + $this->em->flush(); + $this->em->clear(); + } + + public function testOptimisticLockNoExceptionOnFind() : void + { + try { + $entity = $this->em->find(GH7366Entity::class, 1, LockMode::OPTIMISTIC); + } catch (TransactionRequiredException $e) { + self::fail('EntityManager::find() threw TransactionRequiredException with LockMode::OPTIMISTIC'); + } + self::assertEquals('baz', $entity->getName()); + } +} + +/** + * @ORM\Entity + */ +class GH7366Entity +{ + /** + * @ORM\Id + * @ORM\Column(type="integer") + * @ORM\GeneratedValue + * @var int + */ + public $id; + + /** + * @ORM\Column(type="integer") + * @ORM\Version + */ + protected $lockVersion = 1; + + /** + * @ORM\Column(length=32) + * @var string + */ + protected $name; + + + public function __construct(string $name) + { + $this->name = $name; + } + + public function getName() : string + { + return $this->name; + } +}