[DDC-692] Add ClassMetadataInfo::isReadOnly flag and ignore these entities in Change Tracking.
This commit is contained in:
parent
003ab06465
commit
9a75277dd4
@ -334,6 +334,10 @@ class ClassMetadata extends ClassMetadataInfo
|
||||
$serialized[] = 'namedQueries';
|
||||
}
|
||||
|
||||
if ($this->isReadOnly) {
|
||||
$serialized[] = 'isReadOnly';
|
||||
}
|
||||
|
||||
return $serialized;
|
||||
}
|
||||
|
||||
|
@ -484,6 +484,17 @@ class ClassMetadataInfo implements ClassMetadata
|
||||
*/
|
||||
public $reflClass;
|
||||
|
||||
/**
|
||||
* Is this entity marked as "read-only"?
|
||||
*
|
||||
* That means it is never considered for change-tracking in the UnitOfWork. It is a very helpful performance
|
||||
* optimization for entities that are immutable, either in your domain or through the relation database
|
||||
* (coming from a view, or a history table for example).
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $isReadOnly = false;
|
||||
|
||||
/**
|
||||
* Initializes a new ClassMetadata instance that will hold the object-relational mapping
|
||||
* metadata of the class with the given name.
|
||||
@ -1818,4 +1829,14 @@ class ClassMetadataInfo implements ClassMetadata
|
||||
{
|
||||
$this->versionField = $versionField;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark this class as read only, no change tracking is applied to it.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function markReadOnly()
|
||||
{
|
||||
$this->isReadOnly = true;
|
||||
}
|
||||
}
|
||||
|
@ -514,9 +514,9 @@ class UnitOfWork implements PropertyChangedListener
|
||||
$class = $this->em->getClassMetadata($className);
|
||||
|
||||
// Skip class if instances are read-only
|
||||
//if ($class->isReadOnly) {
|
||||
// continue;
|
||||
//}
|
||||
if ($class->isReadOnly) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If change tracking is explicit or happens through notification, then only compute
|
||||
// changes on entities of that type that are explicitly marked for synchronization.
|
||||
|
@ -30,6 +30,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase
|
||||
$cm->setCustomRepositoryClass("UserRepository");
|
||||
$cm->setDiscriminatorColumn(array('name' => 'disc', 'type' => 'integer'));
|
||||
$cm->mapOneToOne(array('fieldName' => 'phonenumbers', 'targetEntity' => 'Bar', 'mappedBy' => 'foo'));
|
||||
$cm->markReadOnly();
|
||||
$cm->addNamedQuery(array('name' => 'dql', 'query' => 'foo'));
|
||||
$this->assertEquals(1, count($cm->associationMappings));
|
||||
|
||||
$serialized = serialize($cm);
|
||||
@ -51,6 +53,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase
|
||||
$this->assertTrue($oneOneMapping['fetch'] == ClassMetadata::FETCH_LAZY);
|
||||
$this->assertEquals('phonenumbers', $oneOneMapping['fieldName']);
|
||||
$this->assertEquals('Doctrine\Tests\Models\CMS\Bar', $oneOneMapping['targetEntity']);
|
||||
$this->assertTrue($cm->isReadOnly);
|
||||
$this->assertEquals(array('dql' => 'foo'), $cm->namedQueries);
|
||||
}
|
||||
|
||||
public function testFieldIsNullable()
|
||||
|
Loading…
x
Reference in New Issue
Block a user