Make sure we're using the rootEntityName on all places
Otherwise we might end up with duplicated cache entries and weird results (specially regarding associations).
This commit is contained in:
parent
4f28aaa206
commit
1f53afa9cd
@ -65,8 +65,9 @@ class DefaultCollectionHydrator implements CollectionHydrator
|
|||||||
$data = [];
|
$data = [];
|
||||||
|
|
||||||
foreach ($collection as $index => $entity) {
|
foreach ($collection as $index => $entity) {
|
||||||
$data[$index] = new EntityCacheKey($metadata->name, $this->uow->getEntityIdentifier($entity));
|
$data[$index] = new EntityCacheKey($metadata->rootEntityName, $this->uow->getEntityIdentifier($entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new CollectionCacheEntry($data);
|
return new CollectionCacheEntry($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +175,8 @@ class DefaultEntityHydrator implements EntityHydrator
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$assocKey = new EntityCacheKey($assoc['targetEntity'], $assocId);
|
$assocMetadata = $this->em->getClassMetadata($assoc['targetEntity']);
|
||||||
|
$assocKey = new EntityCacheKey($assocMetadata->rootEntityName, $assocId);
|
||||||
$assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']);
|
$assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']);
|
||||||
$assocRegion = $assocPersister->getCacheRegion();
|
$assocRegion = $assocPersister->getCacheRegion();
|
||||||
$assocEntry = $assocRegion->get($assocKey);
|
$assocEntry = $assocRegion->get($assocKey);
|
||||||
|
@ -148,13 +148,13 @@ class DefaultQueryCache implements QueryCache
|
|||||||
$data = $entityEntry->data;
|
$data = $entityEntry->data;
|
||||||
|
|
||||||
foreach ($entry['associations'] as $name => $assoc) {
|
foreach ($entry['associations'] as $name => $assoc) {
|
||||||
|
|
||||||
$assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']);
|
$assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']);
|
||||||
$assocRegion = $assocPersister->getCacheRegion();
|
$assocRegion = $assocPersister->getCacheRegion();
|
||||||
|
$assocMetadata = $this->em->getClassMetadata($assoc['targetEntity']);
|
||||||
|
|
||||||
if ($assoc['type'] & ClassMetadata::TO_ONE) {
|
if ($assoc['type'] & ClassMetadata::TO_ONE) {
|
||||||
|
|
||||||
if (($assocEntry = $assocRegion->get($assocKey = new EntityCacheKey($assoc['targetEntity'], $assoc['identifier']))) === null) {
|
if (($assocEntry = $assocRegion->get($assocKey = new EntityCacheKey($assocMetadata->rootEntityName, $assoc['identifier']))) === null) {
|
||||||
|
|
||||||
if ($this->cacheLogger !== null) {
|
if ($this->cacheLogger !== null) {
|
||||||
$this->cacheLogger->entityCacheMiss($assocRegion->getName(), $assocKey);
|
$this->cacheLogger->entityCacheMiss($assocRegion->getName(), $assocKey);
|
||||||
@ -178,12 +178,11 @@ class DefaultQueryCache implements QueryCache
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$targetClass = $this->em->getClassMetadata($assoc['targetEntity']);
|
$collection = new PersistentCollection($this->em, $assocMetadata, new ArrayCollection());
|
||||||
$collection = new PersistentCollection($this->em, $targetClass, new ArrayCollection());
|
|
||||||
|
|
||||||
foreach ($assoc['list'] as $assocIndex => $assocId) {
|
foreach ($assoc['list'] as $assocIndex => $assocId) {
|
||||||
|
|
||||||
if (($assocEntry = $assocRegion->get($assocKey = new EntityCacheKey($assoc['targetEntity'], $assocId))) === null) {
|
if (($assocEntry = $assocRegion->get($assocKey = new EntityCacheKey($assocMetadata->rootEntityName, $assocId))) === null) {
|
||||||
|
|
||||||
if ($this->cacheLogger !== null) {
|
if ($this->cacheLogger !== null) {
|
||||||
$this->cacheLogger->entityCacheMiss($assocRegion->getName(), $assocKey);
|
$this->cacheLogger->entityCacheMiss($assocRegion->getName(), $assocKey);
|
||||||
|
@ -272,7 +272,8 @@ abstract class AbstractEntityPersister implements CachedEntityPersister
|
|||||||
}
|
}
|
||||||
|
|
||||||
$assocId = $this->uow->getEntityIdentifier($assocEntity);
|
$assocId = $this->uow->getEntityIdentifier($assocEntity);
|
||||||
$assocKey = new EntityCacheKey($assoc['targetEntity'], $assocId);
|
$assocMetadata = $this->metadataFactory->getMetadataFor($assoc['targetEntity']);
|
||||||
|
$assocKey = new EntityCacheKey($assocMetadata->rootEntityName, $assocId);
|
||||||
$assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']);
|
$assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']);
|
||||||
|
|
||||||
$assocPersister->storeEntityCache($assocEntity, $assocKey);
|
$assocPersister->storeEntityCache($assocEntity, $assocKey);
|
||||||
|
128
tests/Doctrine/Tests/ORM/Functional/Ticket/GH5562Test.php
Normal file
128
tests/Doctrine/Tests/ORM/Functional/Ticket/GH5562Test.php
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
<?php
|
||||||
|
namespace Doctrine\Tests\ORM\Functional\Ticket;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
||||||
|
use Doctrine\DBAL\Types\StringType;
|
||||||
|
use Doctrine\DBAL\Types\Type;
|
||||||
|
use Doctrine\ORM\AbstractQuery;
|
||||||
|
use Doctrine\Tests\OrmFunctionalTestCase;
|
||||||
|
|
||||||
|
final class GH5562Test extends OrmFunctionalTestCase
|
||||||
|
{
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->enableSecondLevelCache();
|
||||||
|
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->_schemaTool->createSchema(
|
||||||
|
[
|
||||||
|
$this->_em->getClassMetadata(GH5562User::class),
|
||||||
|
$this->_em->getClassMetadata(GH5562Manager::class),
|
||||||
|
$this->_em->getClassMetadata(GH5562Merchant::class),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group 5562
|
||||||
|
*/
|
||||||
|
public function testCacheShouldBeUpdatedWhenAssociationChanges()
|
||||||
|
{
|
||||||
|
$manager = new GH5562Manager();
|
||||||
|
$merchant = new GH5562Merchant();
|
||||||
|
|
||||||
|
$manager->username = 'username';
|
||||||
|
$manager->merchant = $merchant;
|
||||||
|
$merchant->manager = $manager;
|
||||||
|
|
||||||
|
$merchant->name = 'Merchant';
|
||||||
|
|
||||||
|
$this->_em->persist($merchant);
|
||||||
|
$this->_em->persist($manager);
|
||||||
|
$this->_em->flush();
|
||||||
|
$this->_em->clear();
|
||||||
|
|
||||||
|
$merchant = $this->_em->find(GH5562Merchant::class, $merchant->id);
|
||||||
|
|
||||||
|
$merchant->name = mt_rand();
|
||||||
|
$merchant->manager->username = 'usernameUPDATE';
|
||||||
|
|
||||||
|
$this->_em->flush();
|
||||||
|
$this->_em->clear();
|
||||||
|
|
||||||
|
$merchant = $this->_em->find(GH5562Merchant::class, $merchant->id);
|
||||||
|
|
||||||
|
self::assertEquals('usernameUPDATE', $merchant->manager->username);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Entity
|
||||||
|
* @Cache(usage="NONSTRICT_READ_WRITE")
|
||||||
|
*/
|
||||||
|
class GH5562Merchant
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var integer
|
||||||
|
*
|
||||||
|
* @Id
|
||||||
|
* @Column(name="id", type="integer")
|
||||||
|
* @GeneratedValue(strategy="IDENTITY")
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var GH5562Manager
|
||||||
|
*
|
||||||
|
* @OneToOne(targetEntity=GH5562Manager::class, mappedBy="merchant")
|
||||||
|
* @Cache(usage="NONSTRICT_READ_WRITE")
|
||||||
|
*/
|
||||||
|
public $manager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*
|
||||||
|
* @Column(name="name", type="string", length=255, nullable=false)
|
||||||
|
*/
|
||||||
|
public $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Entity
|
||||||
|
* @InheritanceType("SINGLE_TABLE")
|
||||||
|
* @DiscriminatorMap({"MANAGER" = GH5562Manager::class})
|
||||||
|
*/
|
||||||
|
abstract class GH5562User
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var integer
|
||||||
|
*
|
||||||
|
* @Id
|
||||||
|
* @Column(name="id", type="integer")
|
||||||
|
* @GeneratedValue(strategy="IDENTITY")
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Entity
|
||||||
|
* @Cache(usage="NONSTRICT_READ_WRITE")
|
||||||
|
*/
|
||||||
|
class GH5562Manager extends GH5562User
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*
|
||||||
|
* @Column
|
||||||
|
*/
|
||||||
|
public $username;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var GH5562Merchant
|
||||||
|
*
|
||||||
|
* @OneToOne(targetEntity=GH5562Merchant::class, inversedBy="manager")
|
||||||
|
*/
|
||||||
|
public $merchant;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user