Fixes DDC-2984. Made DDC-742 more resilient to recurring failures.
This commit is contained in:
parent
68d477a4c6
commit
5ce6dabe9b
@ -2510,16 +2510,16 @@ class UnitOfWork implements PropertyChangedListener
|
|||||||
? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']]
|
? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']]
|
||||||
: $data[$fieldName];
|
: $data[$fieldName];
|
||||||
}
|
}
|
||||||
|
|
||||||
$idHash = implode(' ', $id);
|
|
||||||
} else {
|
} else {
|
||||||
$idHash = isset($class->associationMappings[$class->identifier[0]])
|
$id = isset($class->associationMappings[$class->identifier[0]])
|
||||||
? $data[$class->associationMappings[$class->identifier[0]]['joinColumns'][0]['name']]
|
? $data[$class->associationMappings[$class->identifier[0]]['joinColumns'][0]['name']]
|
||||||
: $data[$class->identifier[0]];
|
: $data[$class->identifier[0]];
|
||||||
|
|
||||||
$id = array($class->identifier[0] => $idHash);
|
$id = array($class->identifier[0] => $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$idHash = implode(' ', $id);
|
||||||
|
|
||||||
if (isset($this->identityMap[$class->rootEntityName][$idHash])) {
|
if (isset($this->identityMap[$class->rootEntityName][$idHash])) {
|
||||||
$entity = $this->identityMap[$class->rootEntityName][$idHash];
|
$entity = $this->identityMap[$class->rootEntityName][$idHash];
|
||||||
$oid = spl_object_hash($entity);
|
$oid = spl_object_hash($entity);
|
||||||
|
199
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2984Test.php
Normal file
199
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2984Test.php
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Tests\ORM\Functional\Ticket;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
||||||
|
use Doctrine\DBAL\Types\ConversionException;
|
||||||
|
use Doctrine\DBAL\Types\StringType;
|
||||||
|
use Doctrine\DBAL\Types\Type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group DDC-2984
|
||||||
|
*/
|
||||||
|
class DDC2984Test extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||||
|
{
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
if ( ! Type::hasType('ddc2984_domain_user_id')) {
|
||||||
|
Type::addType(
|
||||||
|
'ddc2984_domain_user_id',
|
||||||
|
__NAMESPACE__ . '\DDC2984UserIdCustomDbalType'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->_schemaTool->createSchema(array(
|
||||||
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2984User'),
|
||||||
|
));
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// no action needed - schema seems to be already in place
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIssue()
|
||||||
|
{
|
||||||
|
$user = new DDC2984User(new DDC2984DomainUserId('unique_id_within_a_vo'));
|
||||||
|
$user->applyName('Alex');
|
||||||
|
|
||||||
|
$this->_em->persist($user);
|
||||||
|
$this->_em->flush($user);
|
||||||
|
|
||||||
|
$repository = $this->_em->getRepository(__NAMESPACE__ . "\DDC2984User");
|
||||||
|
|
||||||
|
$sameUser = $repository->find(new DDC2984DomainUserId('unique_id_within_a_vo'));
|
||||||
|
|
||||||
|
//Until know, everything works as expected
|
||||||
|
$this->assertTrue($user->sameIdentityAs($sameUser));
|
||||||
|
|
||||||
|
$this->_em->clear();
|
||||||
|
|
||||||
|
//After clearing the identity map, the UnitOfWork produces the warning described in DDC-2984
|
||||||
|
$equalUser = $repository->find(new DDC2984DomainUserId('unique_id_within_a_vo'));
|
||||||
|
|
||||||
|
$this->assertNotSame($user, $equalUser);
|
||||||
|
$this->assertTrue($user->sameIdentityAs($equalUser));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @Entity @Table(name="users") */
|
||||||
|
class DDC2984User
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Id @Column(type="ddc2984_domain_user_id")
|
||||||
|
* @GeneratedValue(strategy="NONE")
|
||||||
|
*
|
||||||
|
* @var DDC2984DomainUserId
|
||||||
|
*/
|
||||||
|
private $userId;
|
||||||
|
|
||||||
|
/** @Column(type="string", length=50) */
|
||||||
|
private $name;
|
||||||
|
|
||||||
|
public function __construct(DDC2984DomainUserId $aUserId)
|
||||||
|
{
|
||||||
|
$this->userId = $aUserId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return DDC2984DomainUserId
|
||||||
|
*/
|
||||||
|
public function userId()
|
||||||
|
{
|
||||||
|
return $this->userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function name()
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
*/
|
||||||
|
public function applyName($name)
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DDC2984User $other
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function sameIdentityAs(DDC2984User $other)
|
||||||
|
{
|
||||||
|
return $this->userId()->sameValueAs($other->userId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DDC2984DomainUserId ValueObject
|
||||||
|
*
|
||||||
|
* @author Alexander Miertsch <kontakt@codeliner.ws>
|
||||||
|
*/
|
||||||
|
class DDC2984DomainUserId
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $userIdString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $aUserIdString
|
||||||
|
*/
|
||||||
|
public function __construct($aUserIdString)
|
||||||
|
{
|
||||||
|
$this->userIdString = $aUserIdString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function toString()
|
||||||
|
{
|
||||||
|
return $this->userIdString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return $this->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DDC2984DomainUserId $other
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function sameValueAs(DDC2984DomainUserId $other)
|
||||||
|
{
|
||||||
|
return $this->toString() === $other->toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class DDC2984UserIdCustomDbalType
|
||||||
|
*
|
||||||
|
* @author Alexander Miertsch <kontakt@codeliner.ws>
|
||||||
|
*/
|
||||||
|
class DDC2984UserIdCustomDbalType extends StringType
|
||||||
|
{
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return 'ddc2984_domain_user_id';
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public function convertToPHPValue($value, AbstractPlatform $platform)
|
||||||
|
{
|
||||||
|
return ! empty($value)
|
||||||
|
? new DDC2984DomainUserId($value)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public function convertToDatabaseValue($value, AbstractPlatform $platform)
|
||||||
|
{
|
||||||
|
if (empty($value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($value)) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $value instanceof DDC2984DomainUserId) {
|
||||||
|
throw ConversionException::conversionFailed($value, $this->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value->toString();
|
||||||
|
}
|
||||||
|
}
|
@ -79,7 +79,7 @@ class DDC742Test extends \Doctrine\Tests\OrmFunctionalTestCase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @Entity
|
* @Entity
|
||||||
* @Table(name="users")
|
* @Table(name="ddc742_users")
|
||||||
*/
|
*/
|
||||||
class DDC742User
|
class DDC742User
|
||||||
{
|
{
|
||||||
@ -112,7 +112,7 @@ class DDC742User
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @Entity
|
* @Entity
|
||||||
* @Table(name="comments")
|
* @Table(name="ddc742_comments")
|
||||||
*/
|
*/
|
||||||
class DDC742Comment
|
class DDC742Comment
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user