Skip to content

Commit da36409

Browse files
committed
[#2640] Fix ReactiveEntityInitializerImpl
Fixes * return the right lock (different than ORM) * Fix postLoad issue
1 parent 6a2458c commit da36409

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

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

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ else if ( lazyInitializer.isUninitialized() ) {
216216
if ( data.getState() == State.INITIALIZED ) {
217217
registerReloadedEntity( data );
218218
resolveInstanceSubInitializers( data );
219-
if ( rowProcessingState.needsResolveState() ) {
219+
if ( data.getState() == State.INITIALIZED && rowProcessingState.needsResolveState() ) {
220220
// We need to read result set values to correctly populate the query cache
221221
resolveState( data );
222222
}
@@ -336,6 +336,19 @@ public CompletionStage<Void> reactiveInitializeInstance(EntityInitializerData da
336336
assert consistentInstance( data );
337337
return reactiveInitializeEntityInstance( (ReactiveEntityInitializerData) data );
338338
}
339+
else {
340+
if ( data.getRowProcessingState().needsResolveState() ) {
341+
// A sub-initializer might have taken responsibility for this entity,
342+
// but we still need to resolve the state to correctly populate a query cache
343+
resolveState( data );
344+
}
345+
final ReactiveEntityInitializerData reactiveData = (ReactiveEntityInitializerData) data;
346+
if ( getEntityDescriptor().getBytecodeEnhancementMetadata().isEnhancedForLazyLoading()
347+
&& reactiveData.getEntityHolder().getEntityInitializer() != this
348+
&& reactiveData.getEntityHolder().isInitialized() ) {
349+
updateInitializedEntityInstance( data );
350+
}
351+
}
339352
data.setState( State.INITIALIZED );
340353
return voidFuture();
341354
}
@@ -348,7 +361,7 @@ protected CompletionStage<Void> reactiveInitializeEntityInstance(ReactiveEntityI
348361

349362
return reactiveExtractConcreteTypeStateValues( data )
350363
.thenAccept( resolvedEntityState -> {
351-
364+
rowProcessingState.getJdbcValuesSourceProcessingState().registerLoadingEntityHolder( data.getEntityHolder() );
352365
preLoad( data, resolvedEntityState );
353366

354367
if ( isPersistentAttributeInterceptable( data.getEntityInstanceForNotify() ) ) {
@@ -372,18 +385,14 @@ protected CompletionStage<Void> reactiveInitializeEntityInstance(ReactiveEntityI
372385
final Object version = getVersionAssembler() != null ? getVersionAssembler().assemble( rowProcessingState ) : null;
373386
final Object rowId = getRowIdAssembler() != null ? getRowIdAssembler().assemble( rowProcessingState ) : null;
374387

375-
// from the perspective of Hibernate, an entity is read locked as soon as it is read
376-
// so regardless of the requested lock mode, we upgrade to at least the read level
377-
final LockMode lockModeToAcquire = data.getLockMode() == LockMode.NONE ? LockMode.READ : data.getLockMode();
378-
379388
final EntityEntry entityEntry = persistenceContext.addEntry(
380389
data.getEntityInstanceForNotify(),
381390
Status.LOADING,
382391
resolvedEntityState,
383392
rowId,
384393
data.getEntityKey().getIdentifier(),
385394
version,
386-
lockModeToAcquire,
395+
lockModeToAcquire( data ),
387396
true,
388397
data.getConcreteDescriptor(),
389398
false
@@ -404,16 +413,15 @@ protected CompletionStage<Void> reactiveInitializeEntityInstance(ReactiveEntityI
404413
statistics.loadEntity( data.getConcreteDescriptor().getEntityName() );
405414
}
406415
}
407-
updateCaches(
408-
data,
409-
session,
410-
session.getPersistenceContextInternal(),
411-
resolvedEntityState,
412-
version
413-
);
416+
updateCaches( data, session, session.getPersistenceContextInternal(), resolvedEntityState, version );
414417
} );
415418
}
416419

420+
// Hibernate ORM has a similar method, but it checks if we are in a transaction first
421+
private static LockMode lockModeToAcquire(ReactiveEntityInitializerData data) {
422+
return data.getLockMode() == LockMode.NONE ? LockMode.READ : data.getLockMode();
423+
}
424+
417425
protected CompletionStage<Object[]> reactiveExtractConcreteTypeStateValues(ReactiveEntityInitializerData data) {
418426
final RowProcessingState rowProcessingState = data.getRowProcessingState();
419427
final Object[] values = new Object[data.getConcreteDescriptor().getNumberOfAttributeMappings()];
@@ -447,7 +455,9 @@ protected CompletionStage<Void> reactiveResolveEntityInstance1(ReactiveEntityIni
447455
else {
448456
data.setInstance( proxy );
449457
if ( Hibernate.isInitialized( data.getInstance() ) ) {
450-
data.setState( State.INITIALIZED );
458+
if ( data.getEntityHolder().isInitialized() ) {
459+
data.setState( State.INITIALIZED );
460+
}
451461
data.setEntityInstanceForNotify( Hibernate.unproxy( data.getInstance() ) );
452462
}
453463
else {

0 commit comments

Comments
 (0)