1
0
mirror of synced 2025-02-20 22:23:14 +03:00

DDC-1218, DDC-1156 - Fixed bugs with mapped superclasses in inheritance hierachies

This commit is contained in:
Benjamin Eberlei 2011-06-25 10:20:37 +02:00
parent fe8b28a09f
commit 10b70df1af
2 changed files with 53 additions and 3 deletions

View File

@ -248,11 +248,13 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface
// Move down the hierarchy of parent classes, starting from the topmost class
$parent = null;
$rootEntityFound = false;
$visited = array();
foreach ($parentClasses as $className) {
if (isset($this->loadedMetadata[$className])) {
$parent = $this->loadedMetadata[$className];
if ( ! $parent->isMappedSuperclass) {
$rootEntityFound = true;
array_unshift($visited, $className);
}
continue;
@ -281,7 +283,10 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface
throw MappingException::reflectionFailure($className, $e);
}
if ($parent && ! $parent->isMappedSuperclass) {
// If this class has a parent the id generator strategy is inherited.
// However this is only true if the hierachy of parents contains the root entity,
// if it consinsts of mapped superclasses these don't necessarily include the id field.
if ($parent && $rootEntityFound) {
if ($parent->isIdGeneratorSequence()) {
$class->setSequenceGeneratorDefinition($parent->sequenceGeneratorDefinition);
} else if ($parent->isIdGeneratorTable()) {
@ -336,6 +341,7 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface
$parent = $class;
if ( ! $class->isMappedSuperclass) {
$rootEntityFound = true;
array_unshift($visited, $className);
}

View File

@ -113,6 +113,32 @@ class BasicInheritanceMappingTest extends \Doctrine\Tests\OrmTestCase
$this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator);
$this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition);
}
/**
* @group DDC-1156
* @group DDC-1218
*/
public function testSequenceDefinitionInHierachyWithSandwichMappedSuperclass()
{
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\HierachyD');
/* @var $class ClassMetadataInfo */
$this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator);
$this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition);
}
/**
* @group DDC-1156
* @group DDC-1218
*/
public function testMultipleMappedSuperclasses()
{
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\MediumSuperclassEntity');
/* @var $class ClassMetadataInfo */
$this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator);
$this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition);
}
}
class TransientBaseClass {
@ -164,7 +190,8 @@ class EntitySubClass2 extends MappedSuperclassBase {
abstract class HierachyBase
{
/**
* @Column(type="integer") @Id @GeneratedValue
* @Column(type="integer") @Id @GeneratedValue(strategy="SEQUENCE")
* @SequenceGenerator(sequenceName="foo", initialValue="10")
* @var int
*/
public $id;
@ -229,8 +256,25 @@ class SuperclassEntity extends SuperclassBase
abstract class SuperclassBase
{
/**
* @Column(type="integer") @Id @GeneratedValue(strategy="SEQUENCE") @SequenceGenerator(sequenceName="foo", initialValue="10")
* @Column(type="integer") @Id @GeneratedValue(strategy="SEQUENCE")
* @SequenceGenerator(sequenceName="foo", initialValue="10")
* @var int
*/
public $id;
}
/**
* @MappedSuperclass
*/
abstract class MediumSuperclassBase extends SuperclassBase
{
}
/**
* @Entity
*/
class MediumSuperclassEntity extends MediumSuperclassBase
{
}