From d3ce8d45ea906ad2903901c91f579bd80cefcac8 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sun, 15 Dec 2024 17:34:15 +0100 Subject: [PATCH] HHH-18942 JFR events for stateless sessions also add Statistics for upsert --- .../event/internal/EmptyEventManager.java | 10 ++ .../org/hibernate/event/spi/EventManager.java | 4 + .../hibernate/internal/CoreMessageLogger.java | 3 +- .../internal/StatelessSessionImpl.java | 163 +++++++++++++----- .../java/org/hibernate/stat/Statistics.java | 5 + .../stat/internal/EntityStatisticsImpl.java | 10 ++ .../stat/internal/StatisticsImpl.java | 15 ++ .../stat/spi/StatisticsImplementor.java | 7 + .../event/jfr/internal/EntityUpsertEvent.java | 42 +++++ .../event/jfr/internal/JfrEventManager.java | 80 ++++++--- 10 files changed, 267 insertions(+), 72 deletions(-) create mode 100644 hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/EntityUpsertEvent.java diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EmptyEventManager.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EmptyEventManager.java index 137276e7ce..cb612fee33 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EmptyEventManager.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EmptyEventManager.java @@ -266,6 +266,16 @@ public void completeEntityUpdateEvent( } + @Override + public HibernateMonitoringEvent beginEntityUpsertEvent() { + return null; + } + + @Override + public void completeEntityUpsertEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session) { + + } + @Override public HibernateMonitoringEvent beginEntityDeleteEvent() { return null; diff --git a/hibernate-core/src/main/java/org/hibernate/event/spi/EventManager.java b/hibernate-core/src/main/java/org/hibernate/event/spi/EventManager.java index 58fa24e7be..fb05ff7434 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/spi/EventManager.java +++ b/hibernate-core/src/main/java/org/hibernate/event/spi/EventManager.java @@ -165,6 +165,10 @@ void completePrePartialFlush( void completeEntityUpdateEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session); + HibernateMonitoringEvent beginEntityUpsertEvent(); + + void completeEntityUpsertEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session); + HibernateMonitoringEvent beginEntityDeleteEvent(); void completeEntityDeleteEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java index ea77fa3dff..f4db51ddf5 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java @@ -799,7 +799,7 @@ Statements prepared (closed): %s (%s) Second-level cache hits (misses): %s (%s) Entities loaded: %s Entities fetched: %s (minimize this) - Entities updated, inserted, deleted: %s, %s, %s + Entities updated, upserted, inserted, deleted: %s, %s, %s, %s Collections loaded: %s Collections fetched: %s (minimize this) Collections updated, removed, recreated: %s, %s, %s @@ -833,6 +833,7 @@ void logStatistics( long entityLoadCount, long entityFetchCount, long entityUpdateCount, + long entityUpsertCount, long entityInsertCount, long entityDeleteCount, long collectionLoadCount, 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 e6414b7f0f..4338551fa2 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -31,6 +31,8 @@ import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; +import org.hibernate.event.spi.EventManager; +import org.hibernate.event.spi.HibernateMonitoringEvent; import org.hibernate.event.spi.PostDeleteEvent; import org.hibernate.event.spi.PostDeleteEventListener; import org.hibernate.event.spi.PostInsertEvent; @@ -184,17 +186,19 @@ else if ( generator.generatedOnExecution( entity, this ) ) { } else { getInterceptor().onInsert( entity, id, state, persister.getPropertyNames(), persister.getPropertyTypes() ); - persister.getInsertCoordinator().insert( entity, id, state, this ); + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginEntityInsertEvent(); + boolean success = false; + try { + persister.getInsertCoordinator().insert( entity, id, state, this ); + success = true; + } + finally { + eventManager.completeEntityInsertEvent( event, id, persister.getEntityName(), success, this ); + } } } - forEachOwnedCollection( entity, id, persister, - (descriptor, collection) -> { - descriptor.recreate( collection, id, this); - final StatisticsImplementor statistics = getFactory().getStatistics(); - if ( statistics.isStatisticsEnabled() ) { - statistics.recreateCollection( descriptor.getRole() ); - } - } ); + recreateCollections( entity, id, persister ); firePostInsert(entity, id, state, persister); final StatisticsImplementor statistics = getFactory().getStatistics(); if ( statistics.isStatisticsEnabled() ) { @@ -203,6 +207,26 @@ else if ( generator.generatedOnExecution( entity, this ) ) { return id; } + private void recreateCollections(Object entity, Object id, EntityPersister persister) { + forEachOwnedCollection( entity, id, persister, + (descriptor, collection) -> { + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginCollectionRecreateEvent(); + boolean success = false; + try { + descriptor.recreate( collection, id, this ); + success = true; + } + finally { + eventManager.completeCollectionRecreateEvent( event, id, descriptor.getRole(), success, this ); + } + final StatisticsImplementor statistics = getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.recreateCollection( descriptor.getRole() ); + } + } ); + } + // deletes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override @@ -231,17 +255,18 @@ public void delete(String entityName, Object entity) { final Object id = persister.getIdentifier( entity, this ); final Object version = persister.getVersion( entity ); if ( !firePreDelete(entity, id, persister) ) { - getInterceptor() - .onDelete( entity, id, persister.getPropertyNames(), persister.getPropertyTypes() ); - forEachOwnedCollection( entity, id, persister, - (descriptor, collection) -> { - descriptor.remove( id, this ); - final StatisticsImplementor statistics = getFactory().getStatistics(); - if ( statistics.isStatisticsEnabled() ) { - statistics.removeCollection( descriptor.getRole() ); - } - } ); - persister.getDeleteCoordinator().delete( entity, id, version, this ); + getInterceptor().onDelete( entity, id, persister.getPropertyNames(), persister.getPropertyTypes() ); + removeCollections( entity, id, persister ); + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginEntityDeleteEvent(); + boolean success = false; + try { + persister.getDeleteCoordinator().delete( entity, id, version, this ); + success = true; + } + finally { + eventManager.completeEntityDeleteEvent( event, id, persister.getEntityName(), success, this ); + } firePostDelete(entity, id, persister); final StatisticsImplementor statistics = getFactory().getStatistics(); if ( statistics.isStatisticsEnabled() ) { @@ -250,6 +275,27 @@ public void delete(String entityName, Object entity) { } } + private void removeCollections(Object entity, Object id, EntityPersister persister) { + forEachOwnedCollection( entity, id, persister, + (descriptor, collection) -> { + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginCollectionRemoveEvent(); + boolean success = false; + try { + descriptor.remove( id, this ); + success = true; + } + finally { + eventManager.completeCollectionRemoveEvent( event, id, descriptor.getRole(), success, this ); + } + + final StatisticsImplementor statistics = getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.removeCollection( descriptor.getRole() ); + } + } ); + } + // updates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -289,19 +335,18 @@ public void update(String entityName, Object entity) { oldVersion = null; } if ( !firePreUpdate(entity, id, state, persister) ) { - getInterceptor() - .onUpdate( entity, id, state, persister.getPropertyNames(), persister.getPropertyTypes() ); - persister.getUpdateCoordinator().update( entity, id, null, state, oldVersion, null, null, false, this ); - forEachOwnedCollection( entity, id, persister, - (descriptor, collection) -> { - // TODO: can we do better here? - descriptor.remove( id, this ); - descriptor.recreate( collection, id, this ); - final StatisticsImplementor statistics = getFactory().getStatistics(); - if ( statistics.isStatisticsEnabled() ) { - statistics.updateCollection( descriptor.getRole() ); - } - } ); + getInterceptor().onUpdate( entity, id, state, persister.getPropertyNames(), persister.getPropertyTypes() ); + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginEntityUpdateEvent(); + boolean success = false; + try { + persister.getUpdateCoordinator().update( entity, id, null, state, oldVersion, null, null, false, this ); + success = true; + } + finally { + eventManager.completeEntityUpdateEvent( event, id, persister.getEntityName(), success, this ); + } + removeAndRecreateCollections( entity, id, persister ); firePostUpdate(entity, id, state, persister); final StatisticsImplementor statistics = getFactory().getStatistics(); if ( statistics.isStatisticsEnabled() ) { @@ -310,6 +355,28 @@ public void update(String entityName, Object entity) { } } + private void removeAndRecreateCollections(Object entity, Object id, EntityPersister persister) { + forEachOwnedCollection( entity, id, persister, + (descriptor, collection) -> { + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginCollectionRemoveEvent(); + boolean success = false; + try { + // TODO: can we do better here? + descriptor.remove( id, this ); + descriptor.recreate( collection, id, this ); + success = true; + } + finally { + eventManager.completeCollectionRemoveEvent( event, id, descriptor.getRole(), success, this ); + } + final StatisticsImplementor statistics = getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.updateCollection( descriptor.getRole() ); + } + } ); + } + @Override public void upsert(Object entity) { upsert( null, entity ); @@ -336,21 +403,23 @@ public void upsert(String entityName, Object entity) { final Object id = idToUpsert( entity, persister ); final Object[] state = persister.getValues( entity ); if ( !firePreUpsert(entity, id, state, persister) ) { - getInterceptor() - .onUpsert( entity, id, state, persister.getPropertyNames(), persister.getPropertyTypes() ); + getInterceptor().onUpsert( entity, id, state, persister.getPropertyNames(), persister.getPropertyTypes() ); final Object oldVersion = versionToUpsert( entity, persister, state ); - persister.getMergeCoordinator().update( entity, id, null, state, oldVersion, null, null, false, this ); - // TODO: statistics for upsert! - forEachOwnedCollection( entity, id, persister, - (descriptor, collection) -> { - // TODO: can we do better here? - descriptor.remove( id, this ); - descriptor.recreate( collection, id, this ); - final StatisticsImplementor statistics = getFactory().getStatistics(); - if ( statistics.isStatisticsEnabled() ) { - statistics.updateCollection( descriptor.getRole() ); - } - } ); + final EventManager eventManager = getEventManager(); + final HibernateMonitoringEvent event = eventManager.beginEntityUpsertEvent(); + boolean success = false; + try { + persister.getMergeCoordinator().update( entity, id, null, state, oldVersion, null, null, false, this ); + success = true; + } + finally { + eventManager.completeEntityUpsertEvent( event, id, persister.getEntityName(), success, this ); + } + final StatisticsImplementor statistics = getFactory().getStatistics(); + if ( statistics.isStatisticsEnabled() ) { + statistics.upsertEntity( persister.getEntityName() ); + } + removeAndRecreateCollections( entity, id, persister ); firePostUpsert(entity, id, state, persister); } } diff --git a/hibernate-core/src/main/java/org/hibernate/stat/Statistics.java b/hibernate-core/src/main/java/org/hibernate/stat/Statistics.java index c25e44d937..d96a9630f0 100644 --- a/hibernate-core/src/main/java/org/hibernate/stat/Statistics.java +++ b/hibernate-core/src/main/java/org/hibernate/stat/Statistics.java @@ -156,6 +156,11 @@ public interface Statistics { */ long getEntityUpdateCount(); + /** + * The global number of entity upserts. + */ + long getEntityUpsertCount(); + /** * The global number of executed queries. */ diff --git a/hibernate-core/src/main/java/org/hibernate/stat/internal/EntityStatisticsImpl.java b/hibernate-core/src/main/java/org/hibernate/stat/internal/EntityStatisticsImpl.java index 8170c4cd13..a600b70ea5 100644 --- a/hibernate-core/src/main/java/org/hibernate/stat/internal/EntityStatisticsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/stat/internal/EntityStatisticsImpl.java @@ -20,6 +20,7 @@ public class EntityStatisticsImpl extends AbstractCacheableDataStatistics implem private final String rootEntityName; private final LongAdder loadCount = new LongAdder(); private final LongAdder updateCount = new LongAdder(); + private final LongAdder upsertCount = new LongAdder(); private final LongAdder insertCount = new LongAdder(); private final LongAdder deleteCount = new LongAdder(); private final LongAdder fetchCount = new LongAdder(); @@ -50,6 +51,10 @@ public long getUpdateCount() { return updateCount.sum(); } + public long getUpsertCount() { + return upsertCount.sum(); + } + public long getFetchCount() { return fetchCount.sum(); } @@ -70,6 +75,10 @@ void incrementUpdateCount() { updateCount.increment(); } + void incrementUpsertCount() { + upsertCount.increment(); + } + void incrementInsertCount() { insertCount.increment(); } @@ -88,6 +97,7 @@ public String toString() { .append( "[rootEntityName=" ).append( rootEntityName ) .append( ",loadCount=" ).append( this.loadCount ) .append( ",updateCount=" ).append( this.updateCount ) + .append( ",upsertCount=" ).append( this.upsertCount ) .append( ",insertCount=" ).append( this.insertCount ) .append( ",deleteCount=" ).append( this.deleteCount ) .append( ",fetchCount=" ).append( this.fetchCount ) diff --git a/hibernate-core/src/main/java/org/hibernate/stat/internal/StatisticsImpl.java b/hibernate-core/src/main/java/org/hibernate/stat/internal/StatisticsImpl.java index 829e06e3e0..f3e3db02ea 100644 --- a/hibernate-core/src/main/java/org/hibernate/stat/internal/StatisticsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/stat/internal/StatisticsImpl.java @@ -66,6 +66,7 @@ public class StatisticsImpl implements StatisticsImplementor, Service { private final LongAdder entityLoadCount = new LongAdder(); private final LongAdder entityUpdateCount = new LongAdder(); + private final LongAdder entityUpsertCount = new LongAdder(); private final LongAdder entityInsertCount = new LongAdder(); private final LongAdder entityDeleteCount = new LongAdder(); private final LongAdder entityFetchCount = new LongAdder(); @@ -174,6 +175,7 @@ public void clear() { entityDeleteCount.reset(); entityInsertCount.reset(); entityUpdateCount.reset(); + entityUpsertCount.reset(); entityLoadCount.reset(); entityFetchCount.reset(); @@ -280,6 +282,11 @@ public long getEntityUpdateCount() { return entityUpdateCount.sum(); } + @Override + public long getEntityUpsertCount() { + return entityUpsertCount.sum(); + } + @Override public long getOptimisticFailureCount() { return optimisticFailureCount.sum(); @@ -303,6 +310,12 @@ public void updateEntity(String entityName) { getEntityStatistics( entityName ).incrementUpdateCount(); } + @Override + public void upsertEntity(String entityName) { + entityUpsertCount.increment(); + getEntityStatistics( entityName ).incrementUpsertCount(); + } + @Override public void insertEntity(String entityName) { entityInsertCount.increment(); @@ -901,6 +914,7 @@ public void logSummary() { entityLoadCount.sum(), entityFetchCount.sum(), entityUpdateCount.sum(), + entityUpsertCount.sum(), entityInsertCount.sum(), entityDeleteCount.sum(), collectionLoadCount.sum(), @@ -944,6 +958,7 @@ public String toString() { ",second level cache misses=" + secondLevelCacheMissCount + ",entities loaded=" + entityLoadCount + ",entities updated=" + entityUpdateCount + + ",entities upserted=" + entityUpsertCount + ",entities inserted=" + entityInsertCount + ",entities deleted=" + entityDeleteCount + ",entities fetched=" + entityFetchCount + diff --git a/hibernate-core/src/main/java/org/hibernate/stat/spi/StatisticsImplementor.java b/hibernate-core/src/main/java/org/hibernate/stat/spi/StatisticsImplementor.java index b3d340e71d..4a48f81bda 100644 --- a/hibernate-core/src/main/java/org/hibernate/stat/spi/StatisticsImplementor.java +++ b/hibernate-core/src/main/java/org/hibernate/stat/spi/StatisticsImplementor.java @@ -80,6 +80,13 @@ public interface StatisticsImplementor extends Statistics, Service { */ void updateEntity(String entityName); + /** + * Callback about an entity being upserted. + * + * @param entityName The name of the entity upserted. + */ + void upsertEntity(String entityName); + /** * Callback about an entity being inserted * diff --git a/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/EntityUpsertEvent.java b/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/EntityUpsertEvent.java new file mode 100644 index 0000000000..fec2443903 --- /dev/null +++ b/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/EntityUpsertEvent.java @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.event.jfr.internal; + +import jdk.jfr.Category; +import jdk.jfr.Description; +import jdk.jfr.Event; +import jdk.jfr.Label; +import jdk.jfr.Name; +import jdk.jfr.StackTrace; +import org.hibernate.event.spi.HibernateMonitoringEvent; +import org.hibernate.internal.build.AllowNonPortable; + +@Name(EntityUpsertEvent.NAME) +@Label("Entity Upsert") +@Category("Hibernate ORM") +@Description("Entity Upsert") +@StackTrace +@AllowNonPortable +public class EntityUpsertEvent extends Event implements HibernateMonitoringEvent { + public static final String NAME = "org.hibernate.orm.EntityUpsertEvent"; + + @Label("Session Identifier") + public String sessionIdentifier; + + @Label("Entity Identifier") + public String id; + + @Label("Entity Name") + public String entityName; + + @Label("Success") + public boolean success; + + @Override + public String toString() { + return NAME; + } + +} diff --git a/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/JfrEventManager.java b/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/JfrEventManager.java index 3d026f0c49..02160eb237 100644 --- a/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/JfrEventManager.java +++ b/hibernate-jfr/src/main/java/org/hibernate/event/jfr/internal/JfrEventManager.java @@ -43,6 +43,7 @@ public class JfrEventManager implements EventManager { private static final EventType prePartialFlushEventType = EventType.getEventType( PrePartialFlushEvent.class ); private static final EventType entityInsertEventType = EventType.getEventType( EntityInsertEvent.class ); private static final EventType entityUpdateEventType = EventType.getEventType( EntityUpdateEvent.class ); + private static final EventType entityUpsertEventType = EventType.getEventType( EntityUpsertEvent.class ); private static final EventType entityDeleteEventType = EventType.getEventType( EntityDeleteEvent.class ); private static final EventType collectionRecreateEventType = EventType.getEventType( CollectionRecreateEvent.class ); private static final EventType collectionUpdateEventType = EventType.getEventType( CollectionUpdateEvent.class ); @@ -593,6 +594,37 @@ public void completeEntityUpdateEvent( } } + @Override + public HibernateMonitoringEvent beginEntityUpsertEvent() { + if ( entityUpsertEventType.isEnabled() ) { + final EntityUpsertEvent event = new EntityUpsertEvent(); + event.begin(); + return event; + } + else { + return null; + } + } + + @Override + public void completeEntityUpsertEvent( + HibernateMonitoringEvent event, + Object id, String entityName, + boolean success, + SharedSessionContractImplementor session) { + if ( event != null ) { + final EntityUpsertEvent entityUpsertEvent = (EntityUpsertEvent) event; + entityUpsertEvent.end(); + if ( entityUpsertEvent.shouldCommit() ) { + entityUpsertEvent.sessionIdentifier = getSessionIdentifier( session ); + entityUpsertEvent.entityName = entityName; + entityUpsertEvent.id = Objects.toString(id); + entityUpsertEvent.success = success; + entityUpsertEvent.commit(); + } + } + } + @Override public HibernateMonitoringEvent beginEntityDeleteEvent() { if ( entityDeleteEventType.isEnabled() ) { @@ -643,14 +675,14 @@ public void completeCollectionRecreateEvent( boolean success, SharedSessionContractImplementor session) { if ( event != null ) { - final CollectionRecreateEvent entityInsertEvent = (CollectionRecreateEvent) event; - entityInsertEvent.end(); - if ( entityInsertEvent.shouldCommit() ) { - entityInsertEvent.sessionIdentifier = getSessionIdentifier( session ); - entityInsertEvent.role = role; - entityInsertEvent.id = Objects.toString(id); - entityInsertEvent.success = success; - entityInsertEvent.commit(); + final CollectionRecreateEvent collectionRecreateEvent = (CollectionRecreateEvent) event; + collectionRecreateEvent.end(); + if ( collectionRecreateEvent.shouldCommit() ) { + collectionRecreateEvent.sessionIdentifier = getSessionIdentifier( session ); + collectionRecreateEvent.role = role; + collectionRecreateEvent.id = Objects.toString(id); + collectionRecreateEvent.success = success; + collectionRecreateEvent.commit(); } } } @@ -674,14 +706,14 @@ public void completeCollectionUpdateEvent( boolean success, SharedSessionContractImplementor session) { if ( event != null ) { - final CollectionUpdateEvent entityUpdateEvent = (CollectionUpdateEvent) event; - entityUpdateEvent.end(); - if ( entityUpdateEvent.shouldCommit() ) { - entityUpdateEvent.sessionIdentifier = getSessionIdentifier( session ); - entityUpdateEvent.role = role; - entityUpdateEvent.id = Objects.toString(id); - entityUpdateEvent.success = success; - entityUpdateEvent.commit(); + final CollectionUpdateEvent collectionUpdateEvent = (CollectionUpdateEvent) event; + collectionUpdateEvent.end(); + if ( collectionUpdateEvent.shouldCommit() ) { + collectionUpdateEvent.sessionIdentifier = getSessionIdentifier( session ); + collectionUpdateEvent.role = role; + collectionUpdateEvent.id = Objects.toString(id); + collectionUpdateEvent.success = success; + collectionUpdateEvent.commit(); } } } @@ -705,14 +737,14 @@ public void completeCollectionRemoveEvent( boolean success, SharedSessionContractImplementor session) { if ( event != null ) { - final CollectionRemoveEvent entityDeleteEvent = (CollectionRemoveEvent) event; - entityDeleteEvent.end(); - if ( entityDeleteEvent.shouldCommit() ) { - entityDeleteEvent.sessionIdentifier = getSessionIdentifier( session ); - entityDeleteEvent.role = role; - entityDeleteEvent.id = Objects.toString(id); - entityDeleteEvent.success = success; - entityDeleteEvent.commit(); + final CollectionRemoveEvent collectionRemoveEvent = (CollectionRemoveEvent) event; + collectionRemoveEvent.end(); + if ( collectionRemoveEvent.shouldCommit() ) { + collectionRemoveEvent.sessionIdentifier = getSessionIdentifier( session ); + collectionRemoveEvent.role = role; + collectionRemoveEvent.id = Objects.toString(id); + collectionRemoveEvent.success = success; + collectionRemoveEvent.commit(); } } }