Skip to content

Commit 9482956

Browse files
dreab8DavideD
authored andcommitted
[#2735] Hibernate dirty detection fails in case entity member are initialized
1 parent 10605a2 commit 9482956

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveFlushEntityEventListener.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.engine.internal.Nullability;
1414
import org.hibernate.engine.internal.Versioning;
1515
import org.hibernate.engine.spi.EntityEntry;
16+
import org.hibernate.engine.spi.ManagedEntity;
1617
import org.hibernate.engine.spi.PersistenceContext;
1718
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
1819
import org.hibernate.engine.spi.SelfDirtinessTracker;
@@ -42,10 +43,12 @@
4243
import java.util.Arrays;
4344

4445
import static org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer.UNFETCHED_PROPERTY;
46+
import static org.hibernate.engine.internal.ManagedTypeHelper.asManagedEntity;
4547
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
4648
import static org.hibernate.engine.internal.ManagedTypeHelper.asSelfDirtinessTracker;
4749
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
4850
import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTracker;
51+
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfManagedEntity;
4952
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfSelfDirtinessTracker;
5053
import static org.hibernate.engine.internal.Versioning.getVersion;
5154
import 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

Comments
 (0)