diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 1f5f5158b..1d989031c 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -2510,15 +2510,15 @@ class UnitOfWork implements PropertyChangedListener ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName]; } - - $idHash = implode(' ', $id); } 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->identifier[0]]; - $id = array($class->identifier[0] => $idHash); + $id = array($class->identifier[0] => $id); } + + $idHash = implode(' ', $id); if (isset($this->identityMap[$class->rootEntityName][$idHash])) { $entity = $this->identityMap[$class->rootEntityName][$idHash]; diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2984Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2984Test.php new file mode 100644 index 000000000..19439c143 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2984Test.php @@ -0,0 +1,199 @@ +_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 + */ +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 + */ +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(); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php index 6c3b8f1fa..ad4fad95b 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php @@ -79,7 +79,7 @@ class DDC742Test extends \Doctrine\Tests\OrmFunctionalTestCase /** * @Entity - * @Table(name="users") + * @Table(name="ddc742_users") */ class DDC742User { @@ -112,7 +112,7 @@ class DDC742User /** * @Entity - * @Table(name="comments") + * @Table(name="ddc742_comments") */ class DDC742Comment {