HHH-15634 Lazy basic property does not get updated on change

This commit is contained in:
Andrea Boriero 2022-10-27 11:26:50 +02:00 committed by Christian Beikov
parent ee372fad58
commit 6d99eb1068
1 changed files with 29 additions and 1 deletions

View File

@ -3844,7 +3844,7 @@ public abstract class AbstractEntityPersister
if ( entry == null && !isMutable() ) { if ( entry == null && !isMutable() ) {
throw new IllegalStateException( "Updating immutable entity that is not in session yet" ); throw new IllegalStateException( "Updating immutable entity that is not in session yet" );
} }
if ( entityMetamodel.isDynamicUpdate() && dirtyFields != null ) { if ( dirtyFields != null && entityMetamodel.isDynamicUpdate() ) {
// We need to generate the UPDATE SQL when dynamic-update="true" // We need to generate the UPDATE SQL when dynamic-update="true"
propsToUpdate = getPropertiesToUpdate( dirtyFields, hasDirtyCollection ); propsToUpdate = getPropertiesToUpdate( dirtyFields, hasDirtyCollection );
// don't need to check laziness (dirty checking algorithm handles that) // don't need to check laziness (dirty checking algorithm handles that)
@ -3855,6 +3855,24 @@ public abstract class AbstractEntityPersister
null; null;
} }
} }
else if ( dirtyFields != null && hasUninitializedLazyProperties( object ) && hasLazyDirtyFields( dirtyFields ) ) {
// We need to generate the UPDATE SQL when there are dirty lazy fields
propsToUpdate = getPropertiesToUpdate( dirtyFields, hasDirtyCollection );
// don't need to check laziness (dirty checking algorithm handles that)
final boolean[] propertyLaziness = getPropertyLaziness();
// we add also all the non lazy properties because dynamic update is false
for ( int i = 0; i < propertyLaziness.length; i++ ) {
if ( propertyLaziness[i] == false ) {
propsToUpdate[i] = true;
}
}
updateStrings = new String[span];
for ( int j = 0; j < span; j++ ) {
updateStrings[j] = tableUpdateNeeded[j] ?
generateUpdateString( propsToUpdate, j, oldFields, j == 0 && rowId != null ) :
null;
}
}
else if ( !isModifiableEntity( entry ) ) { else if ( !isModifiableEntity( entry ) ) {
// We need to generate UPDATE SQL when a non-modifiable entity (e.g., read-only or immutable) // We need to generate UPDATE SQL when a non-modifiable entity (e.g., read-only or immutable)
// needs: // needs:
@ -3903,6 +3921,16 @@ public abstract class AbstractEntityPersister
} }
} }
private boolean hasLazyDirtyFields(int[] dirtyFields) {
final boolean[] propertyLaziness = getPropertyLaziness();
for ( int i = 0; i < dirtyFields.length; i++ ) {
if ( propertyLaziness[dirtyFields[i]] ) {
return true;
}
}
return false;
}
@Override @Override
public Object insert(Object[] fields, Object object, SharedSessionContractImplementor session) public Object insert(Object[] fields, Object object, SharedSessionContractImplementor session)
throws HibernateException { throws HibernateException {