1111import org .hibernate .bytecode .enhance .spi .interceptor .EnhancementAsProxyLazinessInterceptor ;
1212import org .hibernate .engine .spi .EntityHolder ;
1313import org .hibernate .engine .spi .EntityKey ;
14- import org .hibernate .engine .spi .PersistenceContext ;
1514import org .hibernate .engine .spi .SharedSessionContractImplementor ;
1615import org .hibernate .metamodel .mapping .AttributeMapping ;
1716import org .hibernate .metamodel .mapping .EntityMappingType ;
1817import org .hibernate .metamodel .mapping .internal .ToOneAttributeMapping ;
1918import org .hibernate .persister .entity .EntityPersister ;
20- import org .hibernate .proxy .HibernateProxy ;
2119import org .hibernate .proxy .LazyInitializer ;
2220import org .hibernate .spi .NavigablePath ;
2321import org .hibernate .sql .results .graph .AssemblerCreationState ;
@@ -39,7 +37,8 @@ public abstract class AbstractBatchEntitySelectFetchInitializer<Data extends Abs
3937
4038 protected final EntityInitializer <InitializerData > owningEntityInitializer ;
4139
42- public static abstract class AbstractBatchEntitySelectFetchInitializerData extends EntitySelectFetchInitializerData {
40+ public static abstract class AbstractBatchEntitySelectFetchInitializerData
41+ extends EntitySelectFetchInitializerData {
4342 final boolean batchDisabled ;
4443
4544 // per-row state
@@ -48,10 +47,11 @@ public static abstract class AbstractBatchEntitySelectFetchInitializerData exten
4847 public AbstractBatchEntitySelectFetchInitializerData (
4948 AbstractBatchEntitySelectFetchInitializer <?> initializer ,
5049 RowProcessingState rowProcessingState ) {
51- super ( initializer , rowProcessingState );
50+ super ( rowProcessingState );
5251
5352 batchDisabled = rowProcessingState .isScrollResult ()
54- || !rowProcessingState .getLoadQueryInfluencers ().effectivelyBatchLoadable ( initializer .toOneMapping .getEntityMappingType ().getEntityPersister () );
53+ || !rowProcessingState .getLoadQueryInfluencers ()
54+ .effectivelyBatchLoadable ( initializer .toOneMapping .getEntityMappingType ().getEntityPersister () );
5555 }
5656 }
5757
@@ -73,51 +73,47 @@ public AbstractBatchEntitySelectFetchInitializer(
7373
7474 @ Override
7575 public void resolveKey (Data data ) {
76- if ( data .getState () != State .UNINITIALIZED ) {
77- return ;
78- }
79-
80- data .entityKey = null ;
81- data .setInstance ( null );
82- final RowProcessingState rowProcessingState = data .getRowProcessingState ();
83- //noinspection unchecked
84- final Initializer <InitializerData > initializer = (Initializer <InitializerData >) keyAssembler .getInitializer ();
85- if ( initializer != null ) {
86- final InitializerData subData = initializer .getData ( rowProcessingState );
87- initializer .resolveKey ( subData );
88- data .entityIdentifier = null ;
89- data .setState ( subData .getState () == State .MISSING ? State .MISSING : State .KEY_RESOLVED );
90- }
91- else {
92- data .entityIdentifier = keyAssembler .assemble ( rowProcessingState );
93- data .setState ( data .entityIdentifier == null ? State .MISSING : State .KEY_RESOLVED );
76+ if ( data .getState () == State .UNINITIALIZED ) {
77+ data .entityKey = null ;
78+ data .setInstance ( null );
79+ final RowProcessingState rowProcessingState = data .getRowProcessingState ();
80+ //noinspection unchecked
81+ final Initializer <InitializerData > initializer = (Initializer <InitializerData >) keyAssembler .getInitializer ();
82+ if ( initializer != null ) {
83+ final InitializerData subData = initializer .getData ( rowProcessingState );
84+ initializer .resolveKey ( subData );
85+ data .entityIdentifier = null ;
86+ data .setState ( subData .getState () == State .MISSING ? State .MISSING : State .KEY_RESOLVED );
87+ }
88+ else {
89+ data .entityIdentifier = keyAssembler .assemble ( rowProcessingState );
90+ data .setState ( data .entityIdentifier == null ? State .MISSING : State .KEY_RESOLVED );
91+ }
9492 }
9593 }
9694
9795 @ Override
9896 public void resolveInstance (Data data ) {
99- if ( data .getState () != State .KEY_RESOLVED ) {
100- return ;
101- }
102-
103- data .setState ( State .RESOLVED );
104- final RowProcessingState rowProcessingState = data .getRowProcessingState ();
105- if ( data .entityIdentifier == null ) {
106- // entityIdentifier can be null if the identifier is based on an initializer
107- data .entityIdentifier = keyAssembler .assemble ( rowProcessingState );
97+ if ( data .getState () == State .KEY_RESOLVED ) {
98+ data .setState ( State .RESOLVED );
99+ final RowProcessingState rowProcessingState = data .getRowProcessingState ();
108100 if ( data .entityIdentifier == null ) {
109- data .entityKey = null ;
110- data .setInstance ( null );
111- data .setState ( State .MISSING );
112- return ;
101+ // entityIdentifier can be null if the identifier is based on an initializer
102+ data .entityIdentifier = keyAssembler .assemble ( rowProcessingState );
103+ if ( data .entityIdentifier == null ) {
104+ data .entityKey = null ;
105+ data .setInstance ( null );
106+ data .setState ( State .MISSING );
107+ return ;
108+ }
113109 }
110+ resolveInstanceFromIdentifier ( data );
114111 }
115- resolveInstanceFromIdentifier ( data );
116112 }
117113
118114 protected void resolveInstanceFromIdentifier (Data data ) {
119115 if ( data .batchDisabled ) {
120- initialize ( data );
116+ initializeIfNecessary ( data );
121117 }
122118 else {
123119 data .entityKey = new EntityKey ( data .entityIdentifier , concreteDescriptor );
@@ -136,87 +132,92 @@ public void resolveInstance(Object instance, Data data) {
136132 data .setState ( State .MISSING );
137133 data .entityKey = null ;
138134 data .setInstance ( null );
139- return ;
140135 }
141- final RowProcessingState rowProcessingState = data .getRowProcessingState ();
142- // Only need to extract the identifier if the identifier has a many to one
143- final LazyInitializer lazyInitializer = extractLazyInitializer ( instance );
144- data .entityKey = null ;
145- data .entityIdentifier = null ;
146- if ( lazyInitializer == null ) {
147- // Entity is most probably initialized
148- data .setInstance ( instance );
149- if ( concreteDescriptor .getBytecodeEnhancementMetadata ().isEnhancedForLazyLoading ()
150- && isPersistentAttributeInterceptable ( instance )
151- && getAttributeInterceptor ( instance )
152- instanceof EnhancementAsProxyLazinessInterceptor enhancementInterceptor ) {
153- if ( enhancementInterceptor .isInitialized () ) {
154- data .setState ( State .INITIALIZED );
136+ else {
137+ final RowProcessingState rowProcessingState = data .getRowProcessingState ();
138+ // Only need to extract the identifier if the identifier has a many to one
139+ final LazyInitializer lazyInitializer = extractLazyInitializer ( instance );
140+ data .entityKey = null ;
141+ data .entityIdentifier = null ;
142+ if ( lazyInitializer == null ) {
143+ // Entity is most probably initialized
144+ data .setInstance ( instance );
145+ if ( concreteDescriptor .getBytecodeEnhancementMetadata ().isEnhancedForLazyLoading ()
146+ && isPersistentAttributeInterceptable ( instance )
147+ && getAttributeInterceptor ( instance )
148+ instanceof EnhancementAsProxyLazinessInterceptor enhancementInterceptor ) {
149+ if ( enhancementInterceptor .isInitialized () ) {
150+ data .setState ( State .INITIALIZED );
151+ }
152+ else {
153+ data .setState ( State .RESOLVED );
154+ data .entityIdentifier = enhancementInterceptor .getIdentifier ();
155+ }
156+ if ( keyIsEager && data .entityIdentifier == null ) {
157+ data .entityIdentifier =
158+ concreteDescriptor .getIdentifier ( instance , rowProcessingState .getSession () );
159+ }
155160 }
156161 else {
162+ // If the entity initializer is null, we know the entity is fully initialized,
163+ // otherwise it will be initialized by some other initializer
157164 data .setState ( State .RESOLVED );
158- data .entityIdentifier = enhancementInterceptor .getIdentifier ();
165+ data .entityIdentifier =
166+ concreteDescriptor .getIdentifier ( instance , rowProcessingState .getSession () );
159167 }
160168 }
161- else {
162- // If the entity initializer is null, we know the entity is fully initialized,
163- // otherwise it will be initialized by some other initializer
169+ else if ( lazyInitializer .isUninitialized () ) {
164170 data .setState ( State .RESOLVED );
165- data .entityIdentifier = concreteDescriptor .getIdentifier ( instance , rowProcessingState .getSession () );
171+ data .entityIdentifier = lazyInitializer .getInternalIdentifier ();
172+ }
173+ else {
174+ // Entity is initialized
175+ data .setState ( State .INITIALIZED );
176+ if ( keyIsEager ) {
177+ data .entityIdentifier = lazyInitializer .getInternalIdentifier ();
178+ }
179+ data .setInstance ( lazyInitializer .getImplementation () );
166180 }
167- if ( keyIsEager && data .entityIdentifier == null ) {
168- data .entityIdentifier = concreteDescriptor .getIdentifier ( instance , rowProcessingState .getSession () );
181+
182+ if ( data .getState () == State .RESOLVED ) {
183+ resolveInstanceFromIdentifier ( data );
169184 }
170- }
171- else if ( lazyInitializer .isUninitialized () ) {
172- data .setState ( State .RESOLVED );
173- data .entityIdentifier = lazyInitializer .getInternalIdentifier ();
174- }
175- else {
176- // Entity is initialized
177- data .setState ( State .INITIALIZED );
178185 if ( keyIsEager ) {
179- data .entityIdentifier = lazyInitializer .getInternalIdentifier ();
186+ final Initializer <?> initializer = keyAssembler .getInitializer ();
187+ assert initializer != null ;
188+ initializer .resolveInstance ( data .entityIdentifier , rowProcessingState );
189+ }
190+ else if ( rowProcessingState .needsResolveState () ) {
191+ // Resolve the state of the identifier if result caching is enabled and this is not a query cache hit
192+ keyAssembler .resolveState ( rowProcessingState );
180193 }
181- data .setInstance ( lazyInitializer .getImplementation () );
182- }
183-
184- if ( data .getState () == State .RESOLVED ) {
185- resolveInstanceFromIdentifier ( data );
186- }
187- if ( keyIsEager ) {
188- final Initializer <?> initializer = keyAssembler .getInitializer ();
189- assert initializer != null ;
190- initializer .resolveInstance ( data .entityIdentifier , rowProcessingState );
191- }
192- else if ( rowProcessingState .needsResolveState () ) {
193- // Resolve the state of the identifier if result caching is enabled and this is not a query cache hit
194- keyAssembler .resolveState ( rowProcessingState );
195194 }
196195 }
197196
198197 @ Override
199198 public void initializeInstance (Data data ) {
200- if ( data .getState () != State .RESOLVED ) {
201- return ;
202- }
203- data .setState ( State .INITIALIZED );
204- if ( data .batchDisabled ) {
205- Hibernate .initialize ( data .getInstance () );
199+ if ( data .getState () == State .RESOLVED ) {
200+ data .setState ( State .INITIALIZED );
201+ if ( data .batchDisabled ) {
202+ Hibernate .initialize ( data .getInstance () );
203+ }
206204 }
207205 }
208206
209207 protected Object getExistingInitializedInstance (Data data ) {
210- final SharedSessionContractImplementor session = data .getRowProcessingState ().getSession ();
211- final PersistenceContext persistenceContext = session .getPersistenceContextInternal ();
212- final EntityHolder holder = persistenceContext .getEntityHolder ( data .entityKey );
208+ final EntityHolder holder =
209+ data .getRowProcessingState ().getSession ()
210+ .getPersistenceContextInternal ()
211+ .getEntityHolder ( data .entityKey );
213212 if ( holder != null && holder .getEntity () != null && holder .isEventuallyInitialized () ) {
214213 return holder .getEntity ();
215214 }
216- // we need to register a resolution listener only if there is not an already initialized instance
217- // or an instance that another initializer is loading
218- registerResolutionListener ( data );
219- return null ;
215+ else {
216+ // we need to register a resolution listener only if there is not an already initialized instance
217+ // or an instance that another initializer is loading
218+ registerResolutionListener ( data );
219+ return null ;
220+ }
220221 }
221222
222223 protected void registerToBatchFetchQueue (Data data ) {
@@ -238,7 +239,7 @@ public void initializeInstanceFromParent(Object parentInstance, Data data) {
238239 data .setState ( State .MISSING );
239240 }
240241 else {
241- final LazyInitializer lazyInitializer = HibernateProxy . extractLazyInitializer ( instance );
242+ final LazyInitializer lazyInitializer = extractLazyInitializer ( instance );
242243 if ( lazyInitializer != null && lazyInitializer .isUninitialized () ) {
243244 data .entityKey = new EntityKey ( lazyInitializer .getInternalIdentifier (), concreteDescriptor );
244245 registerToBatchFetchQueue ( data );
@@ -277,22 +278,13 @@ protected static Object loadInstance(
277278
278279 protected AttributeMapping [] getParentEntityAttributes (String attributeName ) {
279280 final EntityPersister entityDescriptor = owningEntityInitializer .getEntityDescriptor ();
280- final AttributeMapping [] parentEntityAttributes = new AttributeMapping [
281- entityDescriptor .getRootEntityDescriptor ()
282- .getSubclassEntityNames ()
283- .size ()
284- ];
285- parentEntityAttributes [entityDescriptor .getSubclassId ()] = getParentEntityAttribute (
286- entityDescriptor ,
287- toOneMapping ,
288- attributeName
289- );
281+ final int size = entityDescriptor .getRootEntityDescriptor ().getSubclassEntityNames ().size ();
282+ final AttributeMapping [] parentEntityAttributes = new AttributeMapping [size ];
283+ parentEntityAttributes [entityDescriptor .getSubclassId ()] =
284+ getParentEntityAttribute ( entityDescriptor , toOneMapping , attributeName );
290285 for ( EntityMappingType subMappingType : entityDescriptor .getSubMappingTypes () ) {
291- parentEntityAttributes [subMappingType .getSubclassId ()] = getParentEntityAttribute (
292- subMappingType ,
293- toOneMapping ,
294- attributeName
295- );
286+ parentEntityAttributes [subMappingType .getSubclassId ()] =
287+ getParentEntityAttribute ( subMappingType , toOneMapping , attributeName );
296288 }
297289 return parentEntityAttributes ;
298290 }
@@ -302,8 +294,9 @@ protected static AttributeMapping getParentEntityAttribute(
302294 ToOneAttributeMapping referencedModelPart ,
303295 String attributeName ) {
304296 final AttributeMapping parentAttribute = subMappingType .findAttributeMapping ( attributeName );
305- if ( parentAttribute != null && parentAttribute .getDeclaringType () == referencedModelPart .getDeclaringType ()
306- .findContainingEntityMapping () ) {
297+ if ( parentAttribute != null
298+ && parentAttribute .getDeclaringType ()
299+ == referencedModelPart .getDeclaringType ().findContainingEntityMapping () ) {
307300 // These checks are needed to avoid setting the instance using the wrong (child's) model part or
308301 // setting it multiple times in case parent and child share the same attribute name for the association.
309302 return parentAttribute ;
0 commit comments