Skip to content
Browse files

Fixes DDC-2984. Made DDC-742 more resilient to recurring failures.

  • Loading branch information...
1 parent 68d477a commit 5ce6dabe9bb9e81eac6fd261db9bd29f7b7f290c @guilhermeblanco guilhermeblanco committed Apr 16, 2014
View
8 lib/Doctrine/ORM/UnitOfWork.php
@@ -2510,15 +2510,15 @@ public function createEntity($className, array $data, &$hints = array())
? $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];
View
199 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2984Test.php
@@ -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();
+ }
+}
View
4 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php
@@ -79,7 +79,7 @@ public function testIssue()
/**
* @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
{

0 comments on commit 5ce6dab

Please sign in to comment.
Something went wrong with that request. Please try again.