HHH-16387 Entity in key not returned when querying

This commit is contained in:
Andrea Boriero 2023-04-05 10:15:08 +02:00
parent bb52619875
commit 947ed23188

View File

@ -71,6 +71,8 @@ public String toString() {
private Boolean stateAllNull; private Boolean stateAllNull;
private Boolean stateInjected; private Boolean stateInjected;
protected Object compositeInstance; protected Object compositeInstance;
private boolean isParentInitialized;
private RowProcessingState wrappedProcessingState;
public AbstractEmbeddableInitializer( public AbstractEmbeddableInitializer(
EmbeddableResultGraphNode resultDescriptor, EmbeddableResultGraphNode resultDescriptor,
@ -207,13 +209,27 @@ public void initializeInstance(RowProcessingState processingState) {
return; return;
} }
} }
if ( isParentInitialized ) {
return;
}
stateInjected = false;
// We need to possibly wrap the processing state if the embeddable is within an aggregate // We need to possibly wrap the processing state if the embeddable is within an aggregate
processingState = wrapProcessingState( processingState ); if ( wrappedProcessingState == null ) {
extractRowState( processingState ); wrappedProcessingState = wrapProcessingState( processingState );
prepareCompositeInstance( processingState ); }
handleParentInjection( processingState ); initializeInstance( );
}
private void initializeInstance() {
stateInjected = false;
extractRowState( wrappedProcessingState );
prepareCompositeInstance( wrappedProcessingState );
if ( isParentInitialized ) {
return;
}
if ( !stateInjected ) {
handleParentInjection( wrappedProcessingState );
}
if ( compositeInstance != NULL_MARKER ) { if ( compositeInstance != NULL_MARKER ) {
notifyResolutionListeners( compositeInstance ); notifyResolutionListeners( compositeInstance );
@ -222,7 +238,7 @@ public void initializeInstance(RowProcessingState processingState) {
// If the composite instance has a lazy initializer attached, this means that the embeddable is actually virtual // If the composite instance has a lazy initializer attached, this means that the embeddable is actually virtual
// and the compositeInstance == entity, so we have to inject the row state into the entity when it finishes resolution // and the compositeInstance == entity, so we have to inject the row state into the entity when it finishes resolution
if ( lazyInitializer != null ) { if ( lazyInitializer != null ) {
final Initializer parentInitializer = processingState.resolveInitializer( navigablePath.getParent() ); final Initializer parentInitializer = wrappedProcessingState.resolveInitializer( navigablePath.getParent() );
if ( parentInitializer != this ) { if ( parentInitializer != this ) {
( (FetchParentAccess) parentInitializer ).registerResolutionListener( (entity) -> { ( (FetchParentAccess) parentInitializer ).registerResolutionListener( (entity) -> {
representationEmbeddable.setValues( entity, rowState ); representationEmbeddable.setValues( entity, rowState );
@ -264,6 +280,11 @@ private void prepareCompositeInstance(RowProcessingState processingState) {
&& !ForeignKeyDescriptor.TARGET_PART_NAME.equals( navigablePath.getLocalName() ) ) { && !ForeignKeyDescriptor.TARGET_PART_NAME.equals( navigablePath.getLocalName() ) ) {
fetchParentAccess.resolveInstance( processingState ); fetchParentAccess.resolveInstance( processingState );
compositeInstance = fetchParentAccess.getInitializedInstance(); compositeInstance = fetchParentAccess.getInitializedInstance();
EntityInitializer entityInitializer = fetchParentAccess.asEntityInitializer();
if ( entityInitializer != null && entityInitializer.isEntityInitialized() ) {
this.isParentInitialized = true;
return;
}
} }
if ( compositeInstance == null ) { if ( compositeInstance == null ) {
@ -485,6 +506,8 @@ public void finishUpRow(RowProcessingState rowProcessingState) {
compositeInstance = null; compositeInstance = null;
stateAllNull = null; stateAllNull = null;
stateInjected = null; stateInjected = null;
isParentInitialized = false;
wrappedProcessingState = null;
clearResolutionListeners(); clearResolutionListeners();
} }