diff --git a/hibernate-core/src/main/java/org/hibernate/collection/spi/AbstractPersistentCollection.java b/hibernate-core/src/main/java/org/hibernate/collection/spi/AbstractPersistentCollection.java index 62e492af41a6..0aceaf1f35f2 100644 --- a/hibernate-core/src/main/java/org/hibernate/collection/spi/AbstractPersistentCollection.java +++ b/hibernate-core/src/main/java/org/hibernate/collection/spi/AbstractPersistentCollection.java @@ -282,7 +282,11 @@ else if ( !session.isConnected() ) { } } else { - if ( !session.isTransactionInProgress() ) { + /* + Whenever the collection lazy loading is triggered during the loading process, + closing the connection will cause an error when RowProcessingStateStandardImpl#next() will be called. + */ + if ( !session.isTransactionInProgress() && session.getPersistenceContext().isLoadFinished() ) { session.getJdbcCoordinator().afterTransaction(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/AbstractCollectionInitializer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/AbstractCollectionInitializer.java index 8073013809eb..e5aa8f6a50b6 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/AbstractCollectionInitializer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/AbstractCollectionInitializer.java @@ -101,6 +101,11 @@ protected void resolveInstance(RowProcessingState rowProcessingState, boolean is if ( loadingEntry != null ) { collectionInstance = loadingEntry.getCollectionInstance(); + if ( collectionInstance.getOwner() == null ) { + parentAccess.registerResolutionListener( + owner -> collectionInstance.setOwner( owner ) + ); + } return; } @@ -108,6 +113,11 @@ protected void resolveInstance(RowProcessingState rowProcessingState, boolean is if ( existing != null ) { collectionInstance = existing; + if ( collectionInstance.getOwner() == null ) { + parentAccess.registerResolutionListener( + owner -> collectionInstance.setOwner( owner ) + ); + } return; }