Merge branch 'hotfix/#1573-merge-associated-versioned-entity-2.5.x' into 2.5
Close #1573
This commit is contained in:
commit
62719f2a97
@ -1870,7 +1870,7 @@ class UnitOfWork implements PropertyChangedListener
|
||||
}
|
||||
}
|
||||
|
||||
if ($class->isVersioned) {
|
||||
if ($class->isVersioned && $this->isLoaded($managedCopy) && $this->isLoaded($entity)) {
|
||||
$reflField = $class->reflFields[$class->versionField];
|
||||
$managedCopyVersion = $reflField->getValue($managedCopy);
|
||||
$entityVersion = $reflField->getValue($entity);
|
||||
@ -1883,7 +1883,7 @@ class UnitOfWork implements PropertyChangedListener
|
||||
|
||||
$visited[$oid] = $managedCopy; // mark visited
|
||||
|
||||
if (!($entity instanceof Proxy && ! $entity->__isInitialized())) {
|
||||
if ($this->isLoaded($entity)) {
|
||||
if ($managedCopy instanceof Proxy && ! $managedCopy->__isInitialized()) {
|
||||
$managedCopy->__load();
|
||||
}
|
||||
@ -1908,6 +1908,18 @@ class UnitOfWork implements PropertyChangedListener
|
||||
return $managedCopy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if an entity is loaded - must either be a loaded proxy or not a proxy
|
||||
*
|
||||
* @param object $entity
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isLoaded($entity)
|
||||
{
|
||||
return !($entity instanceof Proxy) || $entity->__isInitialized();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets/adds associated managed copies into the previous entity's association field
|
||||
*
|
||||
|
37
tests/Doctrine/Tests/Models/VersionedManyToOne/Article.php
Normal file
37
tests/Doctrine/Tests/Models/VersionedManyToOne/Article.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Tests\Models\VersionedManyToOne;
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
* @Table(name="versioned_many_to_one_article")
|
||||
*/
|
||||
class Article
|
||||
{
|
||||
const CLASSNAME = __CLASS__;
|
||||
|
||||
/**
|
||||
* @Id
|
||||
* @Column(name="id", type="integer")
|
||||
* @GeneratedValue(strategy="AUTO")
|
||||
*/
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* @Column(name="name")
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* @ManyToOne(targetEntity="Category", cascade={"merge", "persist"})
|
||||
*/
|
||||
public $category;
|
||||
|
||||
/**
|
||||
* Version column
|
||||
*
|
||||
* @Column(type="integer", name="version")
|
||||
* @Version
|
||||
*/
|
||||
public $version;
|
||||
}
|
27
tests/Doctrine/Tests/Models/VersionedManyToOne/Category.php
Normal file
27
tests/Doctrine/Tests/Models/VersionedManyToOne/Category.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Tests\Models\VersionedManyToOne;
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
* @Table(name="versioned_many_to_one_category")
|
||||
*/
|
||||
class Category
|
||||
{
|
||||
const CLASSNAME = __CLASS__;
|
||||
|
||||
/**
|
||||
* @Id
|
||||
* @Column(name="id", type="integer")
|
||||
* @GeneratedValue(strategy="AUTO")
|
||||
*/
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* Version column
|
||||
*
|
||||
* @Column(type="integer", name="version")
|
||||
* @Version
|
||||
*/
|
||||
public $version;
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Tests\ORM\Functional;
|
||||
|
||||
use Doctrine\ORM\OptimisticLockException;
|
||||
use Doctrine\ORM\ORMException;
|
||||
use Doctrine\Tests\Models\VersionedManyToOne\Article;
|
||||
use Doctrine\Tests\Models\VersionedManyToOne\Category;
|
||||
|
||||
/**
|
||||
* @group MergeVersionedOneToMany
|
||||
*/
|
||||
class MergeVersionedManyToOneTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||
{
|
||||
protected function setUp()
|
||||
{
|
||||
$this->useModelSet('versioned_many_to_one');
|
||||
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* This test case asserts that a detached and unmodified entity could be merge without firing
|
||||
* OptimisticLockException.
|
||||
*/
|
||||
public function testSetVersionOnCreate()
|
||||
{
|
||||
$category = new Category();
|
||||
$article = new Article();
|
||||
|
||||
$article->name = 'Article';
|
||||
$article->category = $category;
|
||||
|
||||
$this->_em->persist($article);
|
||||
$this->_em->flush();
|
||||
$this->_em->clear();
|
||||
|
||||
$articleMerged = $this->_em->merge($article);
|
||||
|
||||
$articleMerged->name = 'Article Merged';
|
||||
|
||||
$this->_em->flush();
|
||||
$this->assertEquals(2, $articleMerged->version);
|
||||
}
|
||||
}
|
@ -280,6 +280,10 @@ abstract class OrmFunctionalTestCase extends OrmTestCase
|
||||
'Doctrine\Tests\Models\Pagination\User',
|
||||
'Doctrine\Tests\Models\Pagination\User1',
|
||||
),
|
||||
'versioned_many_to_one' => array(
|
||||
'Doctrine\Tests\Models\VersionedManyToOne\Category',
|
||||
'Doctrine\Tests\Models\VersionedManyToOne\Article',
|
||||
),
|
||||
);
|
||||
|
||||
/**
|
||||
@ -535,6 +539,11 @@ abstract class OrmFunctionalTestCase extends OrmTestCase
|
||||
$conn->executeUpdate('DELETE FROM pagination_user');
|
||||
}
|
||||
|
||||
if (isset($this->_usedModelSets['versioned_many_to_one'])) {
|
||||
$conn->executeUpdate('DELETE FROM versioned_many_to_one_article');
|
||||
$conn->executeUpdate('DELETE FROM versioned_many_to_one_category');
|
||||
}
|
||||
|
||||
$this->_em->clear();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user