DDC-3424: Class Table Inheritance - wrong table order on insert with more than one level of inheritance #4225

Closed
opened 2026-01-22 14:37:39 +01:00 by admin · 8 comments
Owner

Originally created by @doctrinebot on GitHub (Dec 2, 2014).

Originally assigned to: @Ocramius on GitHub.

Jira issue originally created by user bmohammed:

when i use class table inheritance with multiple levels in doctrine :
Account<=User<=Dealer
(Dealer inherits from User, User from Account)
Account has the discriminator column and mapping.
when i persist a new Dealer entity I get a foreign key error because there is no row in the User table.
So the order in which the insert statements are executed:

  1. Insert into Account
  2. Insert into Dealer (which causes the error)
  3. insert into User
    Can someone help me thanks in advance.
Originally created by @doctrinebot on GitHub (Dec 2, 2014). Originally assigned to: @Ocramius on GitHub. Jira issue originally created by user bmohammed: when i use class table inheritance with multiple levels in doctrine : Account<=User<=Dealer (Dealer inherits from User, User from Account) Account has the discriminator column and mapping. when i persist a new Dealer entity I get a foreign key error because there is no row in the User table. So the order in which the insert statements are executed: 1) Insert into Account 2) Insert into Dealer (which causes the error) 3) insert into User Can someone help me thanks in advance.
admin added the Bug label 2026-01-22 14:37:39 +01:00
admin closed this issue 2026-01-22 14:37:39 +01:00
Author
Owner

@doctrinebot commented on GitHub (Dec 2, 2014):

Comment created by @ocramius:

Is this also valid for 2.4.x and master? 2.3.3 is a very old version.

Additionally, could you come up with a small reproduction test case? You can check the ones at https://github.com/doctrine/doctrine2/tree/v2.4.6/tests/Doctrine/Tests/ORM/Functional/Ticket for reference

@doctrinebot commented on GitHub (Dec 2, 2014): Comment created by @ocramius: Is this also valid for `2.4.x` and `master`? 2.3.3 is a very old version. Additionally, could you come up with a small reproduction test case? You can check the ones at https://github.com/doctrine/doctrine2/tree/v2.4.6/tests/Doctrine/Tests/ORM/Functional/Ticket for reference
Author
Owner

@doctrinebot commented on GitHub (Dec 3, 2014):

Comment created by bmohammed:

This is also valid for 2.4.x and master
this is the test case https://github.com/rogerghost/doctrine2/blob/patch-1/tests/Doctrine/Tests/ORM/Persisters/DDC3424Test.php

@doctrinebot commented on GitHub (Dec 3, 2014): Comment created by bmohammed: This is also valid for 2.4.x and master this is the test case https://github.com/rogerghost/doctrine2/blob/patch-1/tests/Doctrine/Tests/ORM/Persisters/DDC3424Test.php
Author
Owner

@hectoras commented on GitHub (Jan 29, 2016):

Is there a bug/workaround for this? I'm having the same issue: http://stackoverflow.com/questions/35093187/inserts-with-multi-level-entity-inheritance-on-doctrine2

@hectoras commented on GitHub (Jan 29, 2016): Is there a bug/workaround for this? I'm having the same issue: http://stackoverflow.com/questions/35093187/inserts-with-multi-level-entity-inheritance-on-doctrine2
Author
Owner

@DHager commented on GitHub (Jan 29, 2016):

Unless it's an issue with the inheritance metadata (which I think it moderately-likely) I believe the "which order to insert in" code lives around \Doctrine\ORM\UnitOfWork::getCommitOrder and \Doctrine\ORM\Internal\CommitOrderCalculator.

@DHager commented on GitHub (Jan 29, 2016): Unless it's an issue with the inheritance metadata (which I think it moderately-likely) I believe the "which order to insert in" code lives around `\Doctrine\ORM\UnitOfWork::getCommitOrder` and `\Doctrine\ORM\Internal\CommitOrderCalculator`.
Author
Owner

@hectoras commented on GitHub (Jan 29, 2016):

I'll try to get more information about how the order is computed on my case, however I don't know much about Doctrine internals. BTW, this is the backtrace of the parent exception Exception thrown, I hope it helps:

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`ngdev`.`genre_chart`, CONSTRAINT `genre_chart_fk_object_set` FOREIGN KEY (`object_id`) REFERENCES `object_set` (`object_id`))
at n/a                                                                      in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 91

at PDOStatement->execute(null)                                              in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 91
at Doctrine\DBAL\Driver\PDOStatement->execute(null)                         in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 165
at Doctrine\DBAL\Statement->execute()                                       in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php line 216
at Doctrine\ORM\Persisters\Entity\JoinedSubclassPersister->executeInserts() in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1018
at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata))           in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
at Doctrine\ORM\UnitOfWork->commit(object(GenreChart))                      in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
at Doctrine\ORM\EntityManager->flush(object(GenreChart))                    in /home/hector/NetBeansProjects/project/app/src/App/Web/Models/ObjectModel.php line 165

at App\Web\Models\ObjectModel->storeObject(object(GenreChart))              in /home/hector/NetBeansProjects/project/app/src/App/Web/Models/Chart.php line 90
at App\Web\Models\Chart->createNewChart(object(MusicGenre), object(DateTime), array(object(ArtistScore), (... more objects...))
                                                                            in /home/hector/NetBeansProjects/project/app/src/App/Web/Controllers/Admin/Frontpage.php line 219

(... method calls from my app...)

at Symfony\Component\HttpKernel\Kernel->handle(object(Request)) in /home/hector/NetBeansProjects/project/public_html/index.php line 16`

\Doctrine\ORM\Version says I'm using '2.5.4'

@hectoras commented on GitHub (Jan 29, 2016): I'll try to get more information about how the order is computed on my case, however I don't know much about Doctrine internals. BTW, this is the backtrace of the parent exception Exception thrown, I hope it helps: ``` PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`ngdev`.`genre_chart`, CONSTRAINT `genre_chart_fk_object_set` FOREIGN KEY (`object_id`) REFERENCES `object_set` (`object_id`)) at n/a in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 91 at PDOStatement->execute(null) in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 91 at Doctrine\DBAL\Driver\PDOStatement->execute(null) in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 165 at Doctrine\DBAL\Statement->execute() in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php line 216 at Doctrine\ORM\Persisters\Entity\JoinedSubclassPersister->executeInserts() in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1018 at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata)) in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378 at Doctrine\ORM\UnitOfWork->commit(object(GenreChart)) in /home/hector/NetBeansProjects/project/app/lib/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356 at Doctrine\ORM\EntityManager->flush(object(GenreChart)) in /home/hector/NetBeansProjects/project/app/src/App/Web/Models/ObjectModel.php line 165 at App\Web\Models\ObjectModel->storeObject(object(GenreChart)) in /home/hector/NetBeansProjects/project/app/src/App/Web/Models/Chart.php line 90 at App\Web\Models\Chart->createNewChart(object(MusicGenre), object(DateTime), array(object(ArtistScore), (... more objects...)) in /home/hector/NetBeansProjects/project/app/src/App/Web/Controllers/Admin/Frontpage.php line 219 (... method calls from my app...) at Symfony\Component\HttpKernel\Kernel->handle(object(Request)) in /home/hector/NetBeansProjects/project/public_html/index.php line 16` ``` \Doctrine\ORM\Version says I'm using '2.5.4'
Author
Owner

@hectoras commented on GitHub (Jan 30, 2016):

I've var_dump()'ed the return value of UnitOfWork::getCommitOrder() prior to the exception. On the ClassMetadata instances returned, the ObjectSet class seems to appear on the parentClasses properties correctly; however, there is not an entry for the ObjectSet class itself.

The dump (removing most of the info as I think it is not relevant for this case) for the value returned by UnitOfWork::getCommitOrder() :

array (
  0 => 
  Doctrine\ORM\Mapping\ClassMetadata::__set_state(array(
     'name' => 'App\\Web\\Entities\\ObjectEngine\\ObjectType',
     'namespace' => 'App\\Web\\Entities\\ObjectEngine',
     'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\ObjectType',
     'parentClasses' =>     array (    ),
     'discriminatorValue' => NULL,
     'discriminatorMap' => array (    ),
     'discriminatorColumn' => NULL,
    )),
  )),
  1 => 
  Doctrine\ORM\Mapping\ClassMetadata::__set_state(array(
     'name' => 'App\\Web\\Entities\\MusicGenre',
     'namespace' => 'App\\Web\\Entities',
     'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object',
     'parentClasses' => array ( 0 => 'App\\Web\\Entities\\ObjectEngine\\Object',    ),
     'discriminatorValue' => 5,
     'discriminatorMap' => array (
      1 => 'App\\Web\\Entities\\Image',
      2 => 'App\\Web\\Entities\\Artist',
      3 => 'App\\Web\\Entities\\ObjectSet',
      4 => 'App\\Web\\Entities\\ImageProvider',
      5 => 'App\\Web\\Entities\\MusicGenre',
      6 => 'App\\Web\\Entities\\GenreChart',
      7 => 'App\\Web\\Entities\\ArtistScoreProvider',
      8 => 'App\\Web\\Entities\\ArtistScore',
    ),
  )),
  2 => 
  Doctrine\ORM\Mapping\ClassMetadata::__set_state(array(
     'name' => 'App\\Web\\Entities\\GenreChart',
     'namespace' => 'App\\Web\\Entities',
     'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object',
     'customGeneratorDefinition' => NULL,
     'customRepositoryClassName' => NULL,
     'isMappedSuperclass' => false,
     'isEmbeddedClass' => false,
     'parentClasses' => array (
        0 => 'App\\Web\\Entities\\ObjectSet',
        1 => 'App\\Web\\Entities\\ObjectEngine\\Object',
      ),
     'discriminatorValue' => 6,
     'discriminatorMap' => array (
       1 => 'App\\Web\\Entities\\Image',
       2 => 'App\\Web\\Entities\\Artist',
       3 => 'App\\Web\\Entities\\ObjectSet',
       4 => 'App\\Web\\Entities\\ImageProvider',
       5 => 'App\\Web\\Entities\\MusicGenre',
       6 => 'App\\Web\\Entities\\GenreChart',
       7 => 'App\\Web\\Entities\\ArtistScoreProvider',
       8 => 'App\\Web\\Entities\\ArtistScore',
      ),     
  )),
  3 => 
  Doctrine\ORM\Mapping\ClassMetadata::__set_state(array(
     'name' => 'App\\Web\\Entities\\Artist',
     'namespace' => 'App\\Web\\Entities',
     'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object',
     'customGeneratorDefinition' => NULL,
     'customRepositoryClassName' => NULL,
     'isMappedSuperclass' => false,
     'isEmbeddedClass' => false,
     'parentClasses' => array ( 0 => 'App\\Web\\Entities\\ObjectEngine\\Object', ),
     'inheritanceType' => 2,
     'generatorType' => 4,
     'discriminatorValue' => 2,
     'discriminatorMap' => array (
       1 => 'App\\Web\\Entities\\Image',
       2 => 'App\\Web\\Entities\\Artist',
       3 => 'App\\Web\\Entities\\ObjectSet',
       4 => 'App\\Web\\Entities\\ImageProvider',
       5 => 'App\\Web\\Entities\\MusicGenre',
       6 => 'App\\Web\\Entities\\GenreChart',
       7 => 'App\\Web\\Entities\\ArtistScoreProvider',
       8 => 'App\\Web\\Entities\\ArtistScore',
     ),
  )),
  4 => 
  Doctrine\ORM\Mapping\ClassMetadata::__set_state(array(
     'name' => 'App\\Web\\Entities\\ArtistScoreProvider',
     'namespace' => 'App\\Web\\Entities',
     'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object',
     'customGeneratorDefinition' => NULL,
     'customRepositoryClassName' => NULL,
     'isMappedSuperclass' => false,
     'isEmbeddedClass' => false,
     'parentClasses' => array (0 => 'App\\Web\\Entities\\ObjectEngine\\Object',),
     'inheritanceType' => 2,
     'generatorType' => 4,
     'discriminatorValue' => 7,
     'discriminatorMap' => array (
       1 => 'App\\Web\\Entities\\Image',
       2 => 'App\\Web\\Entities\\Artist',
       3 => 'App\\Web\\Entities\\ObjectSet',
       4 => 'App\\Web\\Entities\\ImageProvider',
       5 => 'App\\Web\\Entities\\MusicGenre',
       6 => 'App\\Web\\Entities\\GenreChart',
       7 => 'App\\Web\\Entities\\ArtistScoreProvider',
       8 => 'App\\Web\\Entities\\ArtistScore',
      ),
  )),
  5 => 
  Doctrine\ORM\Mapping\ClassMetadata::__set_state(array(
     'name' => 'App\\Web\\Entities\\ArtistScore',
     'namespace' => 'App\\Web\\Entities',
     'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object',
     'customGeneratorDefinition' => NULL,
     'customRepositoryClassName' => NULL,
     'isMappedSuperclass' => false,
     'isEmbeddedClass' => false,
     'parentClasses' => array (0 => 'App\\Web\\Entities\\ObjectEngine\\Object',),
     'inheritanceType' => 2,
     'generatorType' => 4,
     'discriminatorValue' => 8,
     'discriminatorMap' => array (
      1 => 'App\\Web\\Entities\\Image',
      2 => 'App\\Web\\Entities\\Artist',
      3 => 'App\\Web\\Entities\\ObjectSet',
      4 => 'App\\Web\\Entities\\ImageProvider',
      5 => 'App\\Web\\Entities\\MusicGenre',
      6 => 'App\\Web\\Entities\\GenreChart',
      7 => 'App\\Web\\Entities\\ArtistScoreProvider',
      8 => 'App\\Web\\Entities\\ArtistScore',
    ),
     'isIdentifierComposite' => false,
     'containsForeignIdentifier' => false,
  )),
) 

Note there is no entry for App\Web\Entities\ObjectSet.

@hectoras commented on GitHub (Jan 30, 2016): I've `var_dump()`'ed the return value of `UnitOfWork::getCommitOrder()` prior to the exception. On the `ClassMetadata` instances returned, the `ObjectSet` class seems to appear on the `parentClasses` properties correctly; however, there is not an entry for the `ObjectSet` class itself. The dump (removing most of the info as I think it is not relevant for this case) for the value returned by `UnitOfWork::getCommitOrder()` : ``` array ( 0 => Doctrine\ORM\Mapping\ClassMetadata::__set_state(array( 'name' => 'App\\Web\\Entities\\ObjectEngine\\ObjectType', 'namespace' => 'App\\Web\\Entities\\ObjectEngine', 'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\ObjectType', 'parentClasses' => array ( ), 'discriminatorValue' => NULL, 'discriminatorMap' => array ( ), 'discriminatorColumn' => NULL, )), )), 1 => Doctrine\ORM\Mapping\ClassMetadata::__set_state(array( 'name' => 'App\\Web\\Entities\\MusicGenre', 'namespace' => 'App\\Web\\Entities', 'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object', 'parentClasses' => array ( 0 => 'App\\Web\\Entities\\ObjectEngine\\Object', ), 'discriminatorValue' => 5, 'discriminatorMap' => array ( 1 => 'App\\Web\\Entities\\Image', 2 => 'App\\Web\\Entities\\Artist', 3 => 'App\\Web\\Entities\\ObjectSet', 4 => 'App\\Web\\Entities\\ImageProvider', 5 => 'App\\Web\\Entities\\MusicGenre', 6 => 'App\\Web\\Entities\\GenreChart', 7 => 'App\\Web\\Entities\\ArtistScoreProvider', 8 => 'App\\Web\\Entities\\ArtistScore', ), )), 2 => Doctrine\ORM\Mapping\ClassMetadata::__set_state(array( 'name' => 'App\\Web\\Entities\\GenreChart', 'namespace' => 'App\\Web\\Entities', 'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object', 'customGeneratorDefinition' => NULL, 'customRepositoryClassName' => NULL, 'isMappedSuperclass' => false, 'isEmbeddedClass' => false, 'parentClasses' => array ( 0 => 'App\\Web\\Entities\\ObjectSet', 1 => 'App\\Web\\Entities\\ObjectEngine\\Object', ), 'discriminatorValue' => 6, 'discriminatorMap' => array ( 1 => 'App\\Web\\Entities\\Image', 2 => 'App\\Web\\Entities\\Artist', 3 => 'App\\Web\\Entities\\ObjectSet', 4 => 'App\\Web\\Entities\\ImageProvider', 5 => 'App\\Web\\Entities\\MusicGenre', 6 => 'App\\Web\\Entities\\GenreChart', 7 => 'App\\Web\\Entities\\ArtistScoreProvider', 8 => 'App\\Web\\Entities\\ArtistScore', ), )), 3 => Doctrine\ORM\Mapping\ClassMetadata::__set_state(array( 'name' => 'App\\Web\\Entities\\Artist', 'namespace' => 'App\\Web\\Entities', 'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object', 'customGeneratorDefinition' => NULL, 'customRepositoryClassName' => NULL, 'isMappedSuperclass' => false, 'isEmbeddedClass' => false, 'parentClasses' => array ( 0 => 'App\\Web\\Entities\\ObjectEngine\\Object', ), 'inheritanceType' => 2, 'generatorType' => 4, 'discriminatorValue' => 2, 'discriminatorMap' => array ( 1 => 'App\\Web\\Entities\\Image', 2 => 'App\\Web\\Entities\\Artist', 3 => 'App\\Web\\Entities\\ObjectSet', 4 => 'App\\Web\\Entities\\ImageProvider', 5 => 'App\\Web\\Entities\\MusicGenre', 6 => 'App\\Web\\Entities\\GenreChart', 7 => 'App\\Web\\Entities\\ArtistScoreProvider', 8 => 'App\\Web\\Entities\\ArtistScore', ), )), 4 => Doctrine\ORM\Mapping\ClassMetadata::__set_state(array( 'name' => 'App\\Web\\Entities\\ArtistScoreProvider', 'namespace' => 'App\\Web\\Entities', 'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object', 'customGeneratorDefinition' => NULL, 'customRepositoryClassName' => NULL, 'isMappedSuperclass' => false, 'isEmbeddedClass' => false, 'parentClasses' => array (0 => 'App\\Web\\Entities\\ObjectEngine\\Object',), 'inheritanceType' => 2, 'generatorType' => 4, 'discriminatorValue' => 7, 'discriminatorMap' => array ( 1 => 'App\\Web\\Entities\\Image', 2 => 'App\\Web\\Entities\\Artist', 3 => 'App\\Web\\Entities\\ObjectSet', 4 => 'App\\Web\\Entities\\ImageProvider', 5 => 'App\\Web\\Entities\\MusicGenre', 6 => 'App\\Web\\Entities\\GenreChart', 7 => 'App\\Web\\Entities\\ArtistScoreProvider', 8 => 'App\\Web\\Entities\\ArtistScore', ), )), 5 => Doctrine\ORM\Mapping\ClassMetadata::__set_state(array( 'name' => 'App\\Web\\Entities\\ArtistScore', 'namespace' => 'App\\Web\\Entities', 'rootEntityName' => 'App\\Web\\Entities\\ObjectEngine\\Object', 'customGeneratorDefinition' => NULL, 'customRepositoryClassName' => NULL, 'isMappedSuperclass' => false, 'isEmbeddedClass' => false, 'parentClasses' => array (0 => 'App\\Web\\Entities\\ObjectEngine\\Object',), 'inheritanceType' => 2, 'generatorType' => 4, 'discriminatorValue' => 8, 'discriminatorMap' => array ( 1 => 'App\\Web\\Entities\\Image', 2 => 'App\\Web\\Entities\\Artist', 3 => 'App\\Web\\Entities\\ObjectSet', 4 => 'App\\Web\\Entities\\ImageProvider', 5 => 'App\\Web\\Entities\\MusicGenre', 6 => 'App\\Web\\Entities\\GenreChart', 7 => 'App\\Web\\Entities\\ArtistScoreProvider', 8 => 'App\\Web\\Entities\\ArtistScore', ), 'isIdentifierComposite' => false, 'containsForeignIdentifier' => false, )), ) ``` Note there is no entry for `App\Web\Entities\ObjectSet`.
Author
Owner

@mpdude commented on GitHub (Feb 27, 2023):

I cannot imagine this is still an issue. If that would not work, we'd have more bug reports regarding it.

@greg0ire WDYT?

@mpdude commented on GitHub (Feb 27, 2023): I cannot imagine this is still an issue. If that would not work, we'd have more bug reports regarding it. @greg0ire WDYT?
Author
Owner

@greg0ire commented on GitHub (Mar 4, 2023):

No comments for 7 years, let's close 👍

@greg0ire commented on GitHub (Mar 4, 2023): No comments for 7 years, let's close 👍
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#4225