From 8c2db89f2b578c3f888abf8aff3cf81ee8dcdb25 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 21 Aug 2011 15:01:57 +0200 Subject: [PATCH] DDC-1340 - Fix bug with merge() and optimistic lock exception --- lib/Doctrine/ORM/UnitOfWork.php | 2 +- .../ORM/Functional/DetachedEntityTest.php | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index d62eb62c7..a0d49ebff 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -1406,7 +1406,7 @@ class UnitOfWork implements PropertyChangedListener $entityVersion = $class->reflFields[$class->versionField]->getValue($entity); // Throw exception if versions dont match. if ($managedCopyVersion != $entityVersion) { - throw OptimisticLockException::lockFailedVersionMissmatch($entityVersion, $managedCopyVersion); + throw OptimisticLockException::lockFailedVersionMissmatch($entity, $entityVersion, $managedCopyVersion); } } diff --git a/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php b/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php index 5d7e889ae..ee265d0ea 100644 --- a/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php @@ -5,6 +5,7 @@ namespace Doctrine\Tests\ORM\Functional; use Doctrine\Tests\Models\CMS\CmsUser; use Doctrine\Tests\Models\CMS\CmsPhonenumber; use Doctrine\Tests\Models\CMS\CmsAddress; +use Doctrine\Tests\Models\CMS\CmsArticle; use Doctrine\ORM\UnitOfWork; require_once __DIR__ . '/../../TestInit.php'; @@ -192,5 +193,26 @@ class DetachedEntityTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertFalse($this->_em->contains($user)); $this->assertFalse($this->_em->getUnitOfWork()->isInIdentityMap($user)); } + + /** + * @group DDC-1340 + */ + public function testMergeArticleWrongVersion() + { + $article = new CmsArticle(); + $article->topic = "test"; + $article->text = "test"; + + $this->_em->persist($article); + $this->_em->flush(); + + $this->_em->detach($article); + + $sql = "UPDATE cms_articles SET version = version+1 WHERE id = " . $article->id; + $this->_em->getConnection()->executeUpdate($sql); + + $this->setExpectedException('Doctrine\ORM\OptimisticLockException', 'The optimistic lock failed, version 1 was expected, but is actually 2'); + $this->_em->merge($article); + } }