diff --git a/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php b/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php index b654c0425..62f76205e 100644 --- a/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php +++ b/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php @@ -75,6 +75,10 @@ class DefaultEntityHydrator implements EntityHydrator $data = $this->uow->getOriginalEntityData($entity); $data = array_merge($data, $metadata->getIdentifierValues($entity)); // why update has no identifier values ? + if ($metadata->isVersioned) { + $data[$metadata->versionField] = $metadata->getFieldValue($entity, $metadata->versionField); + } + foreach ($metadata->associationMappings as $name => $assoc) { if ( ! isset($data[$name])) { continue; diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7067Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7067Test.php new file mode 100644 index 000000000..b82f25c05 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7067Test.php @@ -0,0 +1,69 @@ +enableSecondLevelCache(); + parent::setUp(); + + $this->setUpEntitySchema([GH7067Entity::class]); + } + + /** + * @group 7067 + */ + public function testSLCWithVersion() : void + { + $entity = new GH7067Entity(); + $entity->lastUpdate = new \DateTime(); + + $this->_em->persist($entity); + $this->_em->flush(); + $this->_em->clear(); + + /** @var GH7067Entity $notCached */ + $notCached = $this->_em->find(GH7067Entity::class, $entity->id); + + self::assertNotNull($notCached->version, 'Version already cached by persister above, it must be not null'); + + $notCached->lastUpdate = new \DateTime(); + + $this->_em->flush(); + $this->_em->clear(); + } +} + +/** + * @Entity() + * @Cache(usage="NONSTRICT_READ_WRITE") + */ +class GH7067Entity +{ + /** + * @Id + * @GeneratedValue + * @Column(type="integer") + * + * @var int + */ + public $id; + + /** + * @Column(type="datetime") + * + * @var \DateTime + */ + public $lastUpdate; + + /** + * @Column(type="datetime") + * @Version + * + * @var \DateTime + */ + public $version; +}