mirror of
https://github.com/doctrine/orm.git
synced 2026-03-24 06:52:09 +01:00
IDENTITY identifier strategy for PostgreSQL breaks when inherited from MappedSuperclass #7216
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @DemoniacDeath on GitHub (Sep 1, 2023).
BC Break Report
Summary
Persisting an
@Entitywhich has it's@Iddefined in it's parent (@MappedSuperclass) withIDENTITYgenerator strategy on PostgreSQL platform.It seems that the breaking change occured in this PR https://github.com/doctrine/orm/pull/10455, specifically changes in
ClassMetadataFactorythat removed the condtion of$rootEntityFoundfor callinginheritIdGeneratorMapping()Previous behavior
In version
2.15.5theIdentityGeneratorused to retrieve inserted id came from the Entity itself with$sequenceNamematching the schema. So the value was retrieved from the correct sequence.Current behavior
Now the
IdentityGeneratorused to retrieve inserted id comes from the parent@MappedSuperclassand$sequenceNameis wrong (name of parent class + sequence suffix) and non-existent in schema, so a PostgreSQL error about relation not existing is thrown.How to reproduce
E.g. (irrelevant code and domain-specific terminology is ommited):
The PostgreSQL sequence used by
idcolumn infoo_bar_task_operator_historytable isfoo_bar_task_operator_history_id_seq.The sequence used to retrieve inserted id was
foo_bar_task_operator_history_id_seqbefore the breaking change. Now it is trying to get the value fromabstracttaskoperatorhistoryrecord_id_seqwhich obviously does not and should not exist. The error thrown is@pkly commented on GitHub (Sep 6, 2023):
I've noticed a similar issue in one of our projects, running on MariaDB, similarly with a parent entity (DiscriminatorMap + Joined inheritance) but in our case I see:
2.15.5 works as expected, 2.16.0 crashes on the same code.
We have a parent entity with a generated id value, the child entity also contains an automatically generated uuid value (via custom generator).
@ghost commented on GitHub (Oct 11, 2023):
Hello I found a workaround which consists of changing the parent's id to protected instead of private
@DemoniacDeath commented on GitHub (Oct 11, 2023):
changing id property from private to protected did not change the result of failing test case https://github.com/doctrine/orm/pull/10928 for me
@mpdude commented on GitHub (Oct 12, 2023):
@DemoniacDeath did you opt into the new „report fields where declared“ setting?
@DemoniacDeath commented on GitHub (Oct 13, 2023):
@mpdude
OrmFunctionalTestCase.php:803it is set to true in the failing test case (by default). changing it to
falsedid not change the outcome.AFAIUI the issue is specifically with the code in
\Doctrine\ORM\Mapping\ClassMetadataFactory::doLoadMetadata@melroy89 commented on GitHub (Oct 27, 2023):
Mbin is also effected by this regression issue of Doctrine: https://github.com/MbinOrg/mbin/pull/147
@mpdude commented on GitHub (Nov 6, 2023):
I see two ways how this could be fixed.
The first one is in #11050. It reverts the way inheritance works for
@SequenceGeneratorDefinitionand mapped superclasses. But, with this change one cannot define@SequenceGeneratorDefinitionon mapped superclasses and expect it to be inherited by child entity classes - at least not when using the newreportFieldsWhereDeclaredmapping driver mode.The second approach is in #11052. It will recognize when an explicit
@SequenceGeneratorDefinitionis used and pass that one on unchanged to child classes (= all use the same sequence name). Otherwise, the default one will be generated for every single class, so the sequence name is based on the table name.@Chris53897 commented on GitHub (Nov 7, 2023):
@mpdude I have tested your solution. Thanks for your work. Looks like it works for me with 2.16.2 and
report_fields_where_declared: true@DemoniacDeath can you confirm this too?
@mpdude commented on GitHub (Nov 7, 2023):
Please also test #11052.
@DemoniacDeath commented on GitHub (Nov 8, 2023):
@Chris53897 @mpdude indeed, both solutions have resolved the issue
@Arkemlar commented on GitHub (Dec 22, 2023):
Same problem here but in my case I use Embeddable that contains id field:
It worked fine with strategy "AUTO", but with strategy "IDENTITY" it throws exception:
SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "product_unit_id_id_seq" does not exist CONTEXT: unnamed portal parameter $1 = '...'Identity strategy so fucked, wasted lots of hours trying to make it work...
@greg0ire commented on GitHub (Dec 22, 2023):
@Arkemlar please stay polite, no one wants to hear you complain like that, especially not people providing you with free software .
@Arkemlar commented on GitHub (Dec 22, 2023):
@greg0ire I didn't mean anyone in person or group of people at all, only Identity strategy feature because it makes a lot of pain working with it.
@mpdude commented on GitHub (Dec 22, 2023):
@Arkemlar do #11050 or #11052 fix your issue as well?
@Arkemlar commented on GitHub (Dec 22, 2023):
@mpdude I tried both, but none fixed my issue :(
Doctrine generates incorrect sequence name
product_unit_id_id_seq, while it must beproduct_unit_id_seq(doctrine:migration:diffgenerated name isproduct_unit_id_id_seq). I don't get how is it possible that migrations work properly while runtime not. I suppose it must use same mappings...The error bumps up when doctrine's
BigIntegerIdentityGeneratortries to get the id of freshly inserted row, see screenshot:Debug panel screenshot
@mpdude commented on GitHub (Dec 22, 2023):
@Arkemlar does your code work with, say, 2.14.x, but broke at or after 2.15.1?
If not (does not work before either) you're seeing an issue different from this one here.
@Arkemlar commented on GitHub (Dec 22, 2023):
@mpdude nope, it is not working in any version unless I use custom id generator that removes sequenceName argument at all. But my problem is similar to topic starter's issue because it caused by invalid sequence name.
@mpdude commented on GitHub (Dec 22, 2023):
Please create a different issue then so we can keep the discussion here focused.