1
0
mirror of synced 2025-01-31 04:21:44 +03:00

[DDC-692] Add ClassMetadataInfo::isReadOnly flag and ignore these entities in Change Tracking.

This commit is contained in:
Benjamin Eberlei 2011-03-29 20:04:14 +02:00
parent 003ab06465
commit 9a75277dd4
4 changed files with 32 additions and 3 deletions

View File

@ -334,6 +334,10 @@ class ClassMetadata extends ClassMetadataInfo
$serialized[] = 'namedQueries'; $serialized[] = 'namedQueries';
} }
if ($this->isReadOnly) {
$serialized[] = 'isReadOnly';
}
return $serialized; return $serialized;
} }

View File

@ -484,6 +484,17 @@ class ClassMetadataInfo implements ClassMetadata
*/ */
public $reflClass; 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 * Initializes a new ClassMetadata instance that will hold the object-relational mapping
* metadata of the class with the given name. * metadata of the class with the given name.
@ -1818,4 +1829,14 @@ class ClassMetadataInfo implements ClassMetadata
{ {
$this->versionField = $versionField; $this->versionField = $versionField;
} }
/**
* Mark this class as read only, no change tracking is applied to it.
*
* @return void
*/
public function markReadOnly()
{
$this->isReadOnly = true;
}
} }

View File

@ -514,9 +514,9 @@ class UnitOfWork implements PropertyChangedListener
$class = $this->em->getClassMetadata($className); $class = $this->em->getClassMetadata($className);
// Skip class if instances are read-only // Skip class if instances are read-only
//if ($class->isReadOnly) { if ($class->isReadOnly) {
// continue; continue;
//} }
// If change tracking is explicit or happens through notification, then only compute // If change tracking is explicit or happens through notification, then only compute
// changes on entities of that type that are explicitly marked for synchronization. // changes on entities of that type that are explicitly marked for synchronization.

View File

@ -30,6 +30,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase
$cm->setCustomRepositoryClass("UserRepository"); $cm->setCustomRepositoryClass("UserRepository");
$cm->setDiscriminatorColumn(array('name' => 'disc', 'type' => 'integer')); $cm->setDiscriminatorColumn(array('name' => 'disc', 'type' => 'integer'));
$cm->mapOneToOne(array('fieldName' => 'phonenumbers', 'targetEntity' => 'Bar', 'mappedBy' => 'foo')); $cm->mapOneToOne(array('fieldName' => 'phonenumbers', 'targetEntity' => 'Bar', 'mappedBy' => 'foo'));
$cm->markReadOnly();
$cm->addNamedQuery(array('name' => 'dql', 'query' => 'foo'));
$this->assertEquals(1, count($cm->associationMappings)); $this->assertEquals(1, count($cm->associationMappings));
$serialized = serialize($cm); $serialized = serialize($cm);
@ -51,6 +53,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase
$this->assertTrue($oneOneMapping['fetch'] == ClassMetadata::FETCH_LAZY); $this->assertTrue($oneOneMapping['fetch'] == ClassMetadata::FETCH_LAZY);
$this->assertEquals('phonenumbers', $oneOneMapping['fieldName']); $this->assertEquals('phonenumbers', $oneOneMapping['fieldName']);
$this->assertEquals('Doctrine\Tests\Models\CMS\Bar', $oneOneMapping['targetEntity']); $this->assertEquals('Doctrine\Tests\Models\CMS\Bar', $oneOneMapping['targetEntity']);
$this->assertTrue($cm->isReadOnly);
$this->assertEquals(array('dql' => 'foo'), $cm->namedQueries);
} }
public function testFieldIsNullable() public function testFieldIsNullable()