Skip to content

Commit f6dd615

Browse files
committed
HHH-19487 move dirty-checking related code out of AbstractEntityPersister
1 parent 823a2a8 commit f6dd615

File tree

5 files changed

+40
-35
lines changed

5 files changed

+40
-35
lines changed

hibernate-core/src/main/java/org/hibernate/engine/internal/EntityEntryImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,12 @@ public void postUpdate(Object entity, Object[] updatedState, Object nextVersion)
306306
.resetDirty( entity, persister, (SessionImplementor) session );
307307
}
308308

309+
@Override
310+
public void postLoad(Object entity) {
311+
processIfSelfDirtinessTracker( entity, EntityEntryImpl::clearDirtyAttributes );
312+
processIfManagedEntity( entity, EntityEntryImpl::useTracker );
313+
}
314+
309315
private static void clearDirtyAttributes(final SelfDirtinessTracker entity) {
310316
entity.$$_hibernate_clearDirtyAttributes();
311317
}

hibernate-core/src/main/java/org/hibernate/engine/spi/EntityEntry.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ public interface EntityEntry {
7070

7171
Object getRowId();
7272

73+
void postLoad(Object entity);
74+
7375
/**
7476
* Handle updating the internal state of the entry after actually performing
7577
* the database update. Specifically, we update the snapshot information and

hibernate-core/src/main/java/org/hibernate/loader/internal/CacheLoadHelper.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -334,21 +334,23 @@ private static Object convertCacheEntryToEntity(
334334
);
335335
}
336336
final Object version = getVersion( values, subclassPersister );
337+
final EntityEntry entityEntry = persistenceContext.addEntry(
338+
entity,
339+
isReadOnly ? Status.READ_ONLY : Status.MANAGED,
340+
values,
341+
null,
342+
entityId,
343+
version,
344+
LockMode.NONE,
345+
true,
346+
subclassPersister,
347+
false
348+
);
337349
holder.setEntityEntry(
338-
persistenceContext.addEntry(
339-
entity,
340-
isReadOnly ? Status.READ_ONLY : Status.MANAGED,
341-
values,
342-
null,
343-
entityId,
344-
version,
345-
LockMode.NONE,
346-
true,
347-
subclassPersister,
348-
false
349-
)
350+
entityEntry
350351
);
351352
subclassPersister.afterInitialize( entity, source );
353+
entityEntry.postLoad( entity );
352354
persistenceContext.initializeNonLazyCollections();
353355

354356
return entity;

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,10 @@
5757
import org.hibernate.engine.spi.EntityHolder;
5858
import org.hibernate.engine.spi.EntityKey;
5959
import org.hibernate.engine.spi.LoadQueryInfluencers;
60-
import org.hibernate.engine.spi.ManagedEntity;
6160
import org.hibernate.engine.spi.NaturalIdResolutions;
6261
import org.hibernate.engine.spi.PersistenceContext;
6362
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
6463
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
65-
import org.hibernate.engine.spi.SelfDirtinessTracker;
6664
import org.hibernate.engine.spi.SessionFactoryImplementor;
6765
import org.hibernate.engine.spi.SessionImplementor;
6866
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -283,9 +281,7 @@
283281
import static org.hibernate.boot.model.internal.SoftDeleteHelper.resolveSoftDeleteMapping;
284282
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
285283
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
286-
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfManagedEntity;
287284
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfPersistentAttributeInterceptable;
288-
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfSelfDirtinessTracker;
289285
import static org.hibernate.generator.EventType.INSERT;
290286
import static org.hibernate.generator.EventType.UPDATE;
291287
import static org.hibernate.internal.util.ReflectHelper.isAbstractClass;
@@ -4042,38 +4038,36 @@ public boolean isVersionPropertyGenerated() {
40424038
&& ( isVersionGeneratedOnExecution() || isVersionGeneratedBeforeExecution() );
40434039
}
40444040

4041+
private Generator versionPropertyGenerator() {
4042+
return getEntityMetamodel().getGenerators()[ getVersionProperty() ];
4043+
}
4044+
40454045
public boolean isVersionGeneratedOnExecution() {
4046-
final Generator strategy = getEntityMetamodel().getGenerators()[ getVersionProperty() ];
4047-
return strategy != null && strategy.generatesSometimes() && strategy.generatedOnExecution();
4046+
final Generator strategy = versionPropertyGenerator();
4047+
return strategy != null
4048+
&& strategy.generatesSometimes()
4049+
&& strategy.generatedOnExecution();
40484050
}
40494051

40504052
public boolean isVersionGeneratedBeforeExecution() {
4051-
final Generator strategy = getEntityMetamodel().getGenerators()[ getVersionProperty() ];
4052-
return strategy != null && strategy.generatesSometimes() && !strategy.generatedOnExecution();
4053+
final Generator strategy = versionPropertyGenerator();
4054+
return strategy != null
4055+
&& strategy.generatesSometimes()
4056+
&& !strategy.generatedOnExecution();
40534057
}
40544058

40554059
@Override
40564060
public void afterInitialize(Object entity, SharedSessionContractImplementor session) {
4057-
if ( isPersistentAttributeInterceptable( entity ) && getRepresentationStrategy().getMode() == POJO ) {
4058-
final BytecodeLazyAttributeInterceptor interceptor = getEntityMetamodel().getBytecodeEnhancementMetadata()
4059-
.extractLazyInterceptor( entity );
4061+
if ( isPersistentAttributeInterceptable( entity )
4062+
&& getRepresentationStrategy().getMode() == POJO ) {
4063+
final BytecodeLazyAttributeInterceptor interceptor =
4064+
getEntityMetamodel().getBytecodeEnhancementMetadata()
4065+
.extractLazyInterceptor( entity );
40604066
assert interceptor != null;
40614067
if ( interceptor.getLinkedSession() == null ) {
40624068
interceptor.setSession( session );
40634069
}
40644070
}
4065-
4066-
// clear the fields that are marked as dirty in the dirtiness tracker
4067-
processIfSelfDirtinessTracker( entity, AbstractEntityPersister::clearDirtyAttributes );
4068-
processIfManagedEntity( entity, AbstractEntityPersister::useTracker );
4069-
}
4070-
4071-
private static void clearDirtyAttributes(final SelfDirtinessTracker entity) {
4072-
entity.$$_hibernate_clearDirtyAttributes();
4073-
}
4074-
4075-
private static void useTracker(final ManagedEntity entity) {
4076-
entity.$$_hibernate_setUseTracker( true );
40774071
}
40784072

40794073
@Override

hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityInitializerImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,6 +1403,7 @@ protected void initializeEntityInstance(EntityInitializerData data) {
14031403
takeSnapshot( data, session, persistenceContext, entityEntry, resolvedEntityState );
14041404

14051405
data.concreteDescriptor.afterInitialize( entityInstanceForNotify, session );
1406+
entityEntry.postLoad( entityInstanceForNotify );
14061407

14071408
assert data.concreteDescriptor.getIdentifier( entityInstanceForNotify, session ) != null;
14081409

0 commit comments

Comments
 (0)