1313import org .hibernate .engine .internal .Nullability ;
1414import org .hibernate .engine .internal .Versioning ;
1515import org .hibernate .engine .spi .EntityEntry ;
16+ import org .hibernate .engine .spi .ManagedEntity ;
1617import org .hibernate .engine .spi .PersistenceContext ;
1718import org .hibernate .engine .spi .PersistentAttributeInterceptor ;
1819import org .hibernate .engine .spi .SelfDirtinessTracker ;
4243import java .util .Arrays ;
4344
4445import static org .hibernate .bytecode .enhance .spi .LazyPropertyInitializer .UNFETCHED_PROPERTY ;
46+ import static org .hibernate .engine .internal .ManagedTypeHelper .asManagedEntity ;
4547import static org .hibernate .engine .internal .ManagedTypeHelper .asPersistentAttributeInterceptable ;
4648import static org .hibernate .engine .internal .ManagedTypeHelper .asSelfDirtinessTracker ;
4749import static org .hibernate .engine .internal .ManagedTypeHelper .isPersistentAttributeInterceptable ;
4850import static org .hibernate .engine .internal .ManagedTypeHelper .isSelfDirtinessTracker ;
51+ import static org .hibernate .engine .internal .ManagedTypeHelper .processIfManagedEntity ;
4952import static org .hibernate .engine .internal .ManagedTypeHelper .processIfSelfDirtinessTracker ;
5053import static org .hibernate .engine .internal .Versioning .getVersion ;
5154import static org .hibernate .engine .internal .Versioning .incrementVersion ;
@@ -223,6 +226,8 @@ private boolean isUpdateNecessary(final FlushEntityEvent event, final boolean mi
223226 else {
224227 final Object entity = event .getEntity ();
225228 processIfSelfDirtinessTracker ( entity , SelfDirtinessTracker ::$$_hibernate_clearDirtyAttributes );
229+ processIfManagedEntity ( entity , DefaultReactiveFlushEntityEventListener ::useTracker );
230+
226231 final EventSource source = event .getSession ();
227232 source .getFactory ()
228233 .getCustomEntityDirtinessStrategy ()
@@ -235,6 +240,10 @@ private boolean isUpdateNecessary(final FlushEntityEvent event, final boolean mi
235240 }
236241 }
237242
243+ private static void useTracker (final ManagedEntity entity ) {
244+ entity .$$_hibernate_setUseTracker ( true );
245+ }
246+
238247 private boolean scheduleUpdate (final FlushEntityEvent event ) {
239248 final EntityEntry entry = event .getEntityEntry ();
240249 final EventSource session = event .getSession ();
@@ -555,7 +564,7 @@ private static int[] getDirtyProperties(FlushEntityEvent event) {
555564 }
556565 else {
557566 final Object entity = event .getEntity ();
558- return isSelfDirtinessTracker ( entity )
567+ return isSelfDirtinessTracker ( entity ) && asManagedEntity ( entity ). $$_hibernate_useTracker ()
559568 ? getDirtyPropertiesFromSelfDirtinessTracker ( asSelfDirtinessTracker ( entity ), event )
560569 : getDirtyPropertiesFromCustomEntityDirtinessStrategy ( event );
561570 }
0 commit comments