1
0
mirror of synced 2025-02-02 13:31:45 +03:00

Merge branch 'hotfix/#1568-identifier-type-cached-incorrectly-backport-2-5' into 2.5

Backport #1568 to 2.5
This commit is contained in:
Marco Pivetta 2016-01-05 22:14:40 +01:00
commit aae43cbb77
3 changed files with 69 additions and 4 deletions

View File

@ -73,7 +73,7 @@ class DefaultEntityHydrator implements EntityHydrator
public function buildCacheEntry(ClassMetadata $metadata, EntityCacheKey $key, $entity) public function buildCacheEntry(ClassMetadata $metadata, EntityCacheKey $key, $entity)
{ {
$data = $this->uow->getOriginalEntityData($entity); $data = $this->uow->getOriginalEntityData($entity);
$data = array_merge($data, $key->identifier); // why update has no identifier values ? $data = array_merge($data, $metadata->getIdentifierValues($entity)); // why update has no identifier values ?
foreach ($metadata->associationMappings as $name => $assoc) { foreach ($metadata->associationMappings as $name => $assoc) {

View File

@ -119,7 +119,7 @@ class DefaultEntityHydratorTest extends OrmTestCase
$this->assertArrayHasKey('name', $cache->data); $this->assertArrayHasKey('name', $cache->data);
$this->assertArrayHasKey('country', $cache->data); $this->assertArrayHasKey('country', $cache->data);
$this->assertEquals(array( $this->assertEquals(array(
'id' => 11, 'id' => 12,
'name' => 'Bar', 'name' => 'Bar',
'country' => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)), 'country' => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)),
), $cache->data); ), $cache->data);
@ -147,9 +147,39 @@ class DefaultEntityHydratorTest extends OrmTestCase
$this->assertArrayHasKey('name', $cache->data); $this->assertArrayHasKey('name', $cache->data);
$this->assertArrayHasKey('country', $cache->data); $this->assertArrayHasKey('country', $cache->data);
$this->assertEquals(array( $this->assertEquals(array(
'id' => 11, 'id' => 12,
'name' => 'Bar', 'name' => 'Bar',
'country' => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)), 'country' => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)),
), $cache->data); ), $cache->data);
} }
public function testCacheEntryWithWrongIdentifierType()
{
$proxy = $this->em->getReference(Country::CLASSNAME, 11);
$entity = new State('Bat', $proxy);
$uow = $this->em->getUnitOfWork();
$entityData = array('id'=> 12, 'name'=>'Bar', 'country' => $proxy);
$metadata = $this->em->getClassMetadata(State::CLASSNAME);
$key = new EntityCacheKey($metadata->name, array('id'=>'12'));
$entity->setId(12);
$uow->registerManaged($entity, array('id'=>12), $entityData);
$cache = $this->structure->buildCacheEntry($metadata, $key, $entity);
$this->assertInstanceOf('Doctrine\ORM\Cache\CacheEntry', $cache);
$this->assertInstanceOf('Doctrine\ORM\Cache\EntityCacheEntry', $cache);
$this->assertArrayHasKey('id', $cache->data);
$this->assertArrayHasKey('name', $cache->data);
$this->assertArrayHasKey('country', $cache->data);
$this->assertSame($entity->getId(), $cache->data['id']);
$this->assertEquals(array(
'id' => 12,
'name' => 'Bar',
'country' => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)),
), $cache->data);
}
} }

View File

@ -0,0 +1,35 @@
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\Tests\Models\Cache\Country;
use Doctrine\Tests\ORM\Functional\SecondLevelCacheAbstractTest;
class DDC3967Test extends SecondLevelCacheAbstractTest
{
protected function setUp()
{
parent::setUp();
$this->loadFixturesCountries();
$this->_em->getCache()->evictEntityRegion(Country::CLASSNAME);
$this->_em->clear();
}
public function testIdentifierCachedWithProperType()
{
$country = array_pop($this->countries);
$id = $country->getId();
// First time, loaded from database
$this->_em->find(Country::CLASSNAME, "$id");
$this->_em->clear();
// Second time, loaded from cache
/** @var Country $country */
$country = $this->_em->find(Country::CLASSNAME, "$id");
// Identifier type should be integer
$this->assertSame($country->getId(), $id);
}
}