d8dd5129e7
As of DDC-1734, proxies should have null identifier when the UnitOFWork refreshes entities and replaces them (marking them as un-managed). The problem here is that refreshes on entities with same identifier but different type are still considered same, and the UnitOfWork discards the proxy instance instead of ignoring it.
151 lines
4.2 KiB
PHP
151 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace Doctrine\Tests\ORM\Functional\Ticket;
|
|
|
|
use Doctrine\Common\Collections\ArrayCollection;
|
|
|
|
/**
|
|
* @group DDC-2306
|
|
*/
|
|
class DDC2306Test extends \Doctrine\Tests\OrmFunctionalTestCase
|
|
{
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
protected function setup()
|
|
{
|
|
parent::setup();
|
|
|
|
$this->_schemaTool->createSchema(array(
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306Zone'),
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306User'),
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306Address'),
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306UserAddress'),
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Verifies that when eager loading is triggered, proxies are kept managed.
|
|
*
|
|
* The problem resides in the refresh hint passed to {@see \Doctrine\ORM\UnitOfWork::createEntity},
|
|
* which, as of DDC-1734, causes the proxy to be marked as un-managed.
|
|
* The check against the identity map only uses the identifier hash and the passed in class name, and
|
|
* does not take into account the fact that the set refresh hint may be for an entity of a different
|
|
* type from the one passed to {@see \Doctrine\ORM\UnitOfWork::createEntity}
|
|
*
|
|
* As a result, a refresh requested for an entity `Foo` with identifier `123` may cause a proxy
|
|
* of type `Bar` with identifier `123` to be marked as un-managed.
|
|
*/
|
|
public function testIssue()
|
|
{
|
|
$zone = new DDC2306Zone();
|
|
$user = new DDC2306User;
|
|
$address = new DDC2306Address;
|
|
$userAddress = new DDC2306UserAddress($user, $address);
|
|
$user->zone = $zone;
|
|
$address->zone = $zone;
|
|
|
|
$this->_em->persist($zone);
|
|
$this->_em->persist($user);
|
|
$this->_em->persist($address);
|
|
$this->_em->persist($userAddress);
|
|
$this->_em->flush();
|
|
$this->_em->clear();
|
|
|
|
/* @var $address DDC2306Address */
|
|
$address = $this->_em->find(__NAMESPACE__ . '\\DDC2306Address', $address->id);
|
|
/* @var $user DDC2306User|\Doctrine\ORM\Proxy\Proxy */
|
|
$user = $address->users->first()->user;
|
|
|
|
$this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $user);
|
|
$this->assertInstanceOf(__NAMESPACE__ . '\\DDC2306User', $user);
|
|
|
|
$userId = $user->id;
|
|
|
|
$this->assertNotNull($userId);
|
|
|
|
$user->__load();
|
|
|
|
$this->assertEquals(
|
|
$userId,
|
|
$user->id,
|
|
'As of DDC-1734, the identifier is NULL for un-managed proxies. The identifier should be an integer here'
|
|
);
|
|
}
|
|
}
|
|
|
|
/** @Entity */
|
|
class DDC2306Zone
|
|
{
|
|
/** @Id @Column(type="integer") @GeneratedValue */
|
|
public $id;
|
|
}
|
|
|
|
/**
|
|
* @Entity
|
|
*/
|
|
class DDC2306User
|
|
{
|
|
/** @Id @Column(type="integer") @GeneratedValue */
|
|
public $id;
|
|
|
|
/**
|
|
* @var DDC2306UserAddress[]|\Doctrine\Common\Collections\Collection
|
|
*
|
|
* @OneToMany(targetEntity="DDC2306UserAddress", mappedBy="user")
|
|
*/
|
|
public $addresses;
|
|
|
|
/** @ManyToOne(targetEntity="DDC2306Zone", fetch="EAGER") */
|
|
public $zone;
|
|
|
|
/** Constructor */
|
|
public function __construct() {
|
|
$this->addresses = new ArrayCollection();
|
|
}
|
|
}
|
|
|
|
/** @Entity */
|
|
class DDC2306Address
|
|
{
|
|
/** @Id @Column(type="integer") @GeneratedValue */
|
|
public $id;
|
|
|
|
/**
|
|
* @var DDC2306UserAddress[]|\Doctrine\Common\Collections\Collection
|
|
*
|
|
* @OneToMany(targetEntity="DDC2306UserAddress", mappedBy="address", orphanRemoval=true)
|
|
*/
|
|
public $users;
|
|
|
|
/** @ManyToOne(targetEntity="DDC2306Zone", fetch="EAGER") */
|
|
public $zone;
|
|
|
|
/** Constructor */
|
|
public function __construct() {
|
|
$this->users = new ArrayCollection();
|
|
}
|
|
}
|
|
|
|
/** @Entity */
|
|
class DDC2306UserAddress
|
|
{
|
|
/** @Id @Column(type="integer") @GeneratedValue */
|
|
public $id;
|
|
|
|
/** @ManyToOne(targetEntity="DDC2306User") */
|
|
public $user;
|
|
|
|
/** @ManyToOne(targetEntity="DDC2306Address", fetch="LAZY") */
|
|
public $address;
|
|
|
|
/** Constructor */
|
|
public function __construct(DDC2306User $user, DDC2306Address $address)
|
|
{
|
|
$this->user = $user;
|
|
$this->address = $address;
|
|
|
|
$user->addresses->add($this);
|
|
$address->users->add($this);
|
|
}
|
|
} |