From 3acfa5021406be425a4558904435976f187cb9a9 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 | 75 +++++++++++++++++++ 2 files changed, 76 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 66aace05d..c35351487 100644 --- a/lib/Doctrine/ORM/EntityManager.php +++ b/lib/Doctrine/ORM/EntityManager.php @@ -926,7 +926,7 @@ use Throwable; if (!$class->isVersioned) { throw OptimisticLockException::notVersioned($class->name); } - // 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 000000000..80f5cae72 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7366Test.php @@ -0,0 +1,75 @@ +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()); + } +} + +/** + * @Entity + */ +class GH7366Entity +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue + * @var int + */ + public $id; + + /** + * @Column(type="integer") + * @Version + */ + protected $lockVersion = 1; + + /** + * @Column(length=32) + * @var string + */ + protected $name; + + + public function __construct(string $name) + { + $this->name = $name; + } + + public function getName(): string + { + return $this->name; + } +}