diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 0a04d05ae..99491d965 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -1700,21 +1700,18 @@ class UnitOfWork implements PropertyChangedListener // do not merge fields marked lazy that have not been fetched. continue; } else if ( ! $assoc2['isCascadeMerge']) { - if ($this->getEntityState($other, self::STATE_DETACHED) == self::STATE_MANAGED) { - $prop->setValue($managedCopy, $other); - } else { - + if ($this->getEntityState($other, self::STATE_DETACHED) !== self::STATE_MANAGED) { $targetClass = $this->em->getClassMetadata($assoc2['targetEntity']); $relatedId = $targetClass->getIdentifierValues($other); if ($targetClass->subClasses) { - $entity = $this->em->find($targetClass->name, $relatedId); + $other = $this->em->find($targetClass->name, $relatedId); } else { - $proxy = $this->em->getProxyFactory()->getProxy($assoc2['targetEntity'], $relatedId); - $prop->setValue($managedCopy, $proxy); - $this->registerManaged($proxy, $relatedId, array()); + $other = $this->em->getProxyFactory()->getProxy($assoc2['targetEntity'], $relatedId); + $this->registerManaged($other, $relatedId, array()); } } + $prop->setValue($managedCopy, $other); } } else { $mergeCol = $prop->getValue($entity); diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php new file mode 100644 index 000000000..7f7e7d575 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php @@ -0,0 +1,146 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1509AbstractFile'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1509File'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1509Picture'), + )); + } catch (\Exception $ignored) { + + } + } + + public function testFailingCase() + { + $file = new DDC1509File; + $thumbnail = new DDC1509File; + + $picture = new DDC1509Picture; + $picture->setFile($file); + $picture->setThumbnail($thumbnail); + + + /* @var $em \Doctrine\ORM\EntityManager */ + $em = $this->_em; + $em->persist($picture); + $em->flush(); + $em->clear(); + + $id = $picture->getPictureId(); + + $pic = $em->merge($picture); + /* @var $pic DDC1509Picture */ + + $this->assertNotNull($pic->getThumbnail()); + $this->assertNotNull($pic->getFile()); + } + +} + +/** + * @Entity + */ +class DDC1509Picture +{ + + /** + * @Column(type="integer") + * @Id + * @GeneratedValue(strategy="AUTO") + */ + private $id; + + /** + * @ManyToOne(targetEntity="DDC1509AbstractFile", cascade={"persist", "remove"}) + */ + private $thumbnail; + + /** + * @ManyToOne(targetEntity="DDC1509AbstractFile", cascade={"persist", "remove"}) + */ + private $file; + + /** + * Get pictureId + */ + public function getPictureId() + { + return $this->id; + } + + /** + * Set file + */ + public function setFile($value = null) + { + $this->file = $value; + } + + /** + * Get file + */ + public function getFile() + { + return $this->file; + } + + public function getThumbnail() + { + return $this->thumbnail; + } + + public function setThumbnail($thumbnail) + { + $this->thumbnail = $thumbnail; + } + +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorColumn(name="discr", type="string") + * @DiscriminatorMap({"file" = "DDC1509File"}) + */ +class DDC1509AbstractFile +{ + + /** + * @Column(type="integer") + * @Id + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * Get fileId + */ + public function getFileId() + { + return $this->id; + } + +} + +/** + * @Entity + */ +class DDC1509File extends DDC1509AbstractFile +{ + +}