HHH-16379 @DynamicUpdate and 'enableDirtyTracking=true' leads to wrong update statement

This commit is contained in:
Andrea Boriero 2023-05-29 17:56:32 +02:00 committed by Andrea Boriero
parent c142eeabfa
commit 37d69bc976

View File

@ -2443,7 +2443,25 @@ public int[] resolveDirtyAttributeIndexes(
if ( attributeNames.length != 0 ) {
final boolean[] propertyUpdateability = entityMetamodel.getPropertyUpdateability();
// Sort attribute names so that we can traverse mappings efficiently
if ( superMappingType == null ) {
/*
Sort attribute names so that we can traverse mappings efficiently
we cannot do this when there is a supertype because given:
class SuperEntity {
private String bSuper;
private String aSuper;
}
class ChildEntity extends SuperEntity {
private String aChild;
private String bChild;
}
`attributeMappings` contains { aSuper, bSuper, aChild, bChild }
while the sorted `attributeNames` { aChild, aSuper, bChild, bSuper }
*/
Arrays.sort( attributeNames );
int index = 0;
for ( int i = 0; i < attributeMappings.size(); i++ ) {
@ -2472,6 +2490,15 @@ public int[] resolveDirtyAttributeIndexes(
}
}
}
else {
for ( String attributeName : attributeNames ) {
final Integer index = entityMetamodel.getPropertyIndexOrNull( attributeName );
if ( index != null && propertyUpdateability[index] && !fields.contains( index ) ) {
fields.add( index );
}
}
}
}
return toIntArray( fields );
}