{"record":{"id":"67d297a721b29f1c","repo":"hibernate/hibernate-orm","slug":"mismatch-between-generated-column-values-and-ident","errorCode":null,"errorMessage":"Mismatch between generated column values and identifier columns for %s","messagePattern":"Mismatch between generated column values and identifier columns for (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java","lineNumber":576,"sourceCode":"\t\tentityPersister().addDiscriminatorToInsertGroup( insertGroupBuilder );\n\t\tentityPersister().addAuxiliaryToInsertGroup( insertGroupBuilder );\n\n\t\t// add the keys\n\t\tinsertGroupBuilder.forEachTableMutationBuilder( (tableMutationBuilder) -> {\n\t\t\tfinal var tableInsertBuilder = (TableInsertBuilder) tableMutationBuilder;\n\t\t\tfinal var tableMapping = (EntityTableMapping) tableInsertBuilder.getMutatingTable().getTableMapping();\n\t\t\tfinal var keyMapping = tableMapping.getKeyMapping();\n\t\t\tif ( tableMapping.isIdentifierTable()\n\t\t\t\t\t&& entityPersister().isIdentifierAssignedByInsert()\n\t\t\t\t\t&& !forceIdentifierBinding ) {\n\t\t\t\tassert entityPersister().getInsertDelegate() != null;\n\t\t\t\tfinal var generator = (OnExecutionGenerator) entityPersister().getGenerator();\n\t\t\t\tfinal boolean[] columnInclusions = generator.getColumnInclusions( dialect, EventType.INSERT );\n\t\t\t\tfinal String[] columnValues = generator.getReferencedColumnValues( dialect, EventType.INSERT );\n\t\t\t\tfinal int keyColumnCount = keyMapping.getColumnCount();\n\t\t\t\tif ( columnInclusions != null ) {\n\t\t\t\t\tif ( columnValues != null && columnValues.length != keyColumnCount ) {\n\t\t\t\t\t\tthrow new IllegalStateException(\n\t\t\t\t\t\t\t\t\"Mismatch between generated column values and identifier columns for \"\n\t\t\t\t\t\t\t\t\t\t+ entityPersister().getEntityName()\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tfor ( int i = 0; i < keyColumnCount; i++ ) {\n\t\t\t\t\t\tif ( columnInclusions[i] ) {\n\t\t\t\t\t\t\tfinal String valueExpression =\n\t\t\t\t\t\t\t\t\tcolumnValues == null\n\t\t\t\t\t\t\t\t\t\t\t? keyMapping.getKeyColumn( i ).getWriteExpression()\n\t\t\t\t\t\t\t\t\t\t\t: columnValues[i];\n\t\t\t\t\t\t\ttableInsertBuilder.addColumnAssignment( keyMapping.getKeyColumn( i ), valueExpression );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( generator.referenceColumnsInSql( dialect, EventType.INSERT ) ) {\n\t\t\t\t\tif ( columnValues != null ) {\n\t\t\t\t\t\tassert columnValues.length == 1;\n\t\t\t\t\t\tassert keyColumnCount == 1;","sourceCodeStart":558,"sourceCodeEnd":594,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java#L558-L594","documentation":"For identifiers generated on execution (OnExecutionGenerator - identity-like generation, database functions or triggers assigning the PK), InsertCoordinatorStandard applies the generator's column inclusions and referenced column values to the key columns. IllegalStateException 'Mismatch between generated column values and identifier columns' means getReferencedColumnValues(dialect, INSERT) returned an array whose length differs from the identifier column count of the table.","triggerScenarios":"A custom OnExecutionGenerator whose getReferencedColumnValues returns a hardcoded array shorter or longer than the key (typically written for single-column ids and reused on @EmbeddedId/@IdClass entities); returning an empty array instead of null; composite keys where only some columns get values.","commonSituations":"Implementing PK-by-trigger or PK-by-database-function generators; migrating an identity-style generator to a composite-key entity; Hibernate upgrades where the null-vs-array contract (null = use the key columns' write expressions) tightened.","solutions":["Return null from getReferencedColumnValues when the database assigns values via the key columns' write expressions","Otherwise return exactly keyColumnCount values, in the same order as the key columns","Keep getColumnInclusions length aligned with the identifier columns as well","Add a CI insert test per generator-backed entity so contract mismatches fail at build time"],"exampleFix":"// before: values array does not match identifier column count\npublic class TriggerPkGenerator implements OnExecutionGenerator {\n    @Override\n    public String[] getReferencedColumnValues(Dialect d, EventType t) {\n        return new String[] { \"gen_pk()\" }; // breaks for composite keys (2 columns)\n    }\n}\n\n// after: let each key column use its own write expression\n@Override\npublic String[] getReferencedColumnValues(Dialect d, EventType t) {\n    return null; // null -> per-column write expressions, count always matches\n}","handlingStrategy":"validation","validationCode":"// unit test: generator contract must match identifier column count\n@Test void generatorValuesMatchKeyColumns() {\n    String[] vals = generator.getReferencedColumnValues(dialect, EventType.INSERT);\n    int keyCols = metadata.getEntityBinding(Entity.class.getName())\n            .getRootTable().getPrimaryKey().getColumns().size();\n    assertTrue(vals == null || vals.length == keyCols,\n        \"getReferencedColumnValues length must equal identifier column count or be null\");\n}","typeGuard":null,"tryCatchPattern":"try { session.persist(entity); tx.commit(); } catch (IllegalStateException e) { if (e.getMessage().contains(\"generated column values\")) { /* fix generator to return null or keyColumnCount values */ } throw e; }","preventionTips":["Return null from getReferencedColumnValues unless you supply one value per key column","Unit-test every custom OnExecutionGenerator against the entity's key column count","Re-test generators when adding composite keys to generator-backed entities"],"tags":["hibernate","orm","id-generation","on-execution-generator","custom-generator","composite-key"],"backgroundTag":"custom-id-generator-misconfiguration","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}