diff --git a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java index 4244af1dd644..8b40db27c605 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -712,7 +712,7 @@ protected void forEachOwnedCollection( collection = value == null ? instantiateEmpty( key, descriptor ) - : wrap( descriptor, value ); + : wrap( descriptor, value, entity ); } action.accept( descriptor, collection ); } @@ -729,9 +729,11 @@ protected PersistentCollection instantiateEmpty(Object key, CollectionPersist //TODO: is this the right way to do this? // Hibernate Reactive calls this @SuppressWarnings({"rawtypes", "unchecked"}) - protected PersistentCollection wrap(CollectionPersister descriptor, Object collection) { + protected PersistentCollection wrap(CollectionPersister descriptor, Object collection, Object owner) { final CollectionSemantics collectionSemantics = descriptor.getCollectionSemantics(); - return collectionSemantics.wrap(collection, descriptor, this); + var wrapped = collectionSemantics.wrap( collection, descriptor, this ); + wrapped.setOwner( owner ); + return wrapped; } // loading ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/events/CollectionListenerInStatelessSessionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/events/CollectionListenerInStatelessSessionTest.java index 7d322d50ac31..192b6963cf5d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/events/CollectionListenerInStatelessSessionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/events/CollectionListenerInStatelessSessionTest.java @@ -18,6 +18,7 @@ import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @DomainModel(annotatedClasses = {EntityA.class, EntityB.class}) @@ -64,6 +65,8 @@ class MyPreCollectionRecreateEventListener implements PreCollectionRecreateEvent @Override public void onPreRecreateCollection(PreCollectionRecreateEvent event) { + assertThat( event.getAffectedOwnerOrNull() ).isNotNull(); + assertThat( event.getCollection().getOwner() ).isNotNull(); called++; } @@ -75,6 +78,8 @@ class MyPreCollectionRemoveEventListener implements PreCollectionRemoveEventList @Override public void onPreRemoveCollection(PreCollectionRemoveEvent event) { + assertThat( event.getAffectedOwnerOrNull() ).isNotNull(); + assertThat( event.getCollection().getOwner() ).isNotNull(); called++; } @@ -86,6 +91,8 @@ class MyPostCollectionRecreateEventListener implements PostCollectionRecreateEve @Override public void onPostRecreateCollection(PostCollectionRecreateEvent event) { + assertThat( event.getAffectedOwnerOrNull() ).isNotNull(); + assertThat( event.getCollection().getOwner() ).isNotNull(); called++; } @@ -97,6 +104,8 @@ class MyPostCollectionRemoveEventListener implements PostCollectionRemoveEventLi @Override public void onPostRemoveCollection(PostCollectionRemoveEvent event) { + assertThat( event.getAffectedOwnerOrNull() ).isNotNull(); + assertThat( event.getCollection().getOwner() ).isNotNull(); called++; }