6
6
*/
7
7
package org .hibernate .sql .results .graph .embeddable ;
8
8
9
+ import org .hibernate .engine .internal .ManagedTypeHelper ;
9
10
import org .hibernate .engine .spi .SessionFactoryImplementor ;
10
11
import org .hibernate .metamodel .mapping .CompositeIdentifierMapping ;
11
12
import org .hibernate .metamodel .mapping .EmbeddableMappingType ;
@@ -372,7 +373,8 @@ private void handleParentInjection(RowProcessingState processingState) {
372
373
return ;
373
374
}
374
375
375
- final Object parent = determineParentInstance ( processingState );
376
+ Initializer parentInitializer = determineParentInitializer ( processingState );
377
+ final Object parent = determineParentInstance ( parentInitializer );
376
378
if ( parent == null ) {
377
379
EmbeddableLoadingLogger .EMBEDDED_LOAD_LOGGER .debugf (
378
380
"Unable to determine parent for injection into embeddable [%s]" ,
@@ -388,10 +390,27 @@ private void handleParentInjection(RowProcessingState processingState) {
388
390
compositeInstance
389
391
);
390
392
391
- parentInjectionAccess .getSetter ().set ( compositeInstance , parent );
393
+
394
+ final HibernateProxy proxy ;
395
+ if ( fetchParentAccess != null
396
+ && ( proxy = ManagedTypeHelper .asHibernateProxyOrNull ( parent ) ) != null ) {
397
+ assert parentInitializer != null ;
398
+ assert parentInitializer instanceof EntityInitializer ;
399
+ parentInitializer .asEntityInitializer ().registerResolutionListener (
400
+ o ->
401
+ parentInjectionAccess .getSetter ()
402
+ .set (
403
+ compositeInstance ,
404
+ proxy .getHibernateLazyInitializer ().getImplementation ()
405
+ )
406
+ );
407
+ }
408
+ else {
409
+ parentInjectionAccess .getSetter ().set ( compositeInstance , parent );
410
+ }
392
411
}
393
412
394
- private Object determineParentInstance (RowProcessingState processingState ) {
413
+ private Initializer determineParentInitializer (RowProcessingState processingState ){
395
414
// use `fetchParentAccess` if it is available - it is more efficient
396
415
// and the correct way to do it.
397
416
@@ -409,31 +428,34 @@ private Object determineParentInstance(RowProcessingState processingState) {
409
428
// todo (6.x) - allow injection of containing composite as parent if
410
429
// it is the direct parent
411
430
412
- final FetchParentAccess firstEntityDescriptorAccess = fetchParentAccess .findFirstEntityDescriptorAccess ();
413
- return firstEntityDescriptorAccess .getInitializedInstance ();
431
+ return fetchParentAccess .findFirstEntityDescriptorAccess ();
414
432
}
415
433
416
434
// Otherwise, fallback to determining the parent-initializer by path
417
435
// todo (6.0) - this is the part that should be "subsumed" based on the
418
436
// comment above
419
437
420
438
final NavigablePath parentPath = navigablePath .getParent ();
421
- if ( parentPath == null ) {
422
- return null ;
423
- }
439
+ assert parentPath != null ;
440
+
441
+ return processingState .resolveInitializer ( parentPath );
442
+ }
424
443
425
- final Initializer parentInitializer = processingState .resolveInitializer ( parentPath );
444
+ private Object determineParentInstance (Initializer parentInitializer ) {
445
+ if ( parentInitializer == null ) {
446
+ throw new UnsupportedOperationException ( "Cannot determine Embeddable: " + navigablePath + " parent instance, parent initializer is null" );
447
+ }
426
448
427
449
if ( parentInitializer .isCollectionInitializer () ) {
428
450
return ( (CollectionInitializer ) parentInitializer ).getCollectionInstance ().getOwner ();
429
451
}
430
452
431
453
final EntityInitializer parentEntityInitializer = parentInitializer .asEntityInitializer ();
432
454
if ( parentEntityInitializer != null ) {
433
- return parentEntityInitializer .getEntityInstance ();
455
+ return parentEntityInitializer .getInitializedInstance ();
434
456
}
435
457
436
- throw new UnsupportedOperationException ();
458
+ throw new UnsupportedOperationException ( "The Embeddable: " + navigablePath + " parent initializer is neither an instance of an EntityInitializer nor of a CollectionInitializer" );
437
459
}
438
460
439
461
@ Override
0 commit comments