3131import org .hibernate .engine .spi .PersistenceContext ;
3232import org .hibernate .engine .transaction .internal .jta .JtaStatusHelper ;
3333import org .hibernate .engine .transaction .jta .platform .spi .JtaPlatform ;
34+ import org .hibernate .event .spi .EventManager ;
35+ import org .hibernate .event .spi .HibernateMonitoringEvent ;
3436import org .hibernate .event .spi .PostDeleteEvent ;
3537import org .hibernate .event .spi .PostDeleteEventListener ;
3638import org .hibernate .event .spi .PostInsertEvent ;
@@ -184,23 +186,45 @@ else if ( generator.generatedOnExecution( entity, this ) ) {
184186 }
185187 else {
186188 getInterceptor ().onInsert ( entity , id , state , persister .getPropertyNames (), persister .getPropertyTypes () );
187- persister .getInsertCoordinator ().insert ( entity , id , state , this );
189+ final EventManager eventManager = getEventManager ();
190+ final HibernateMonitoringEvent event = eventManager .beginEntityInsertEvent ();
191+ boolean success = false ;
192+ try {
193+ persister .getInsertCoordinator ().insert ( entity , id , state , this );
194+ success = true ;
195+ }
196+ finally {
197+ eventManager .completeEntityInsertEvent ( event , id , persister .getEntityName (), success , this );
198+ }
188199 }
189200 }
201+ recreateCollections ( entity , id , persister );
202+ firePostInsert (entity , id , state , persister );
203+ final StatisticsImplementor statistics = getFactory ().getStatistics ();
204+ if ( statistics .isStatisticsEnabled () ) {
205+ statistics .insertEntity ( persister .getEntityName () );
206+ }
207+ return id ;
208+ }
209+
210+ private void recreateCollections (Object entity , Object id , EntityPersister persister ) {
190211 forEachOwnedCollection ( entity , id , persister ,
191212 (descriptor , collection ) -> {
192- descriptor .recreate ( collection , id , this );
213+ final EventManager eventManager = getEventManager ();
214+ final HibernateMonitoringEvent event = eventManager .beginCollectionRecreateEvent ();
215+ boolean success = false ;
216+ try {
217+ descriptor .recreate ( collection , id , this );
218+ success = true ;
219+ }
220+ finally {
221+ eventManager .completeCollectionRecreateEvent ( event , id , descriptor .getRole (), success , this );
222+ }
193223 final StatisticsImplementor statistics = getFactory ().getStatistics ();
194224 if ( statistics .isStatisticsEnabled () ) {
195225 statistics .recreateCollection ( descriptor .getRole () );
196226 }
197227 } );
198- firePostInsert (entity , id , state , persister );
199- final StatisticsImplementor statistics = getFactory ().getStatistics ();
200- if ( statistics .isStatisticsEnabled () ) {
201- statistics .insertEntity ( persister .getEntityName () );
202- }
203- return id ;
204228 }
205229
206230 // deletes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -231,17 +255,18 @@ public void delete(String entityName, Object entity) {
231255 final Object id = persister .getIdentifier ( entity , this );
232256 final Object version = persister .getVersion ( entity );
233257 if ( !firePreDelete (entity , id , persister ) ) {
234- getInterceptor ()
235- .onDelete ( entity , id , persister .getPropertyNames (), persister .getPropertyTypes () );
236- forEachOwnedCollection ( entity , id , persister ,
237- (descriptor , collection ) -> {
238- descriptor .remove ( id , this );
239- final StatisticsImplementor statistics = getFactory ().getStatistics ();
240- if ( statistics .isStatisticsEnabled () ) {
241- statistics .removeCollection ( descriptor .getRole () );
242- }
243- } );
244- persister .getDeleteCoordinator ().delete ( entity , id , version , this );
258+ getInterceptor ().onDelete ( entity , id , persister .getPropertyNames (), persister .getPropertyTypes () );
259+ removeCollections ( entity , id , persister );
260+ final EventManager eventManager = getEventManager ();
261+ final HibernateMonitoringEvent event = eventManager .beginEntityDeleteEvent ();
262+ boolean success = false ;
263+ try {
264+ persister .getDeleteCoordinator ().delete ( entity , id , version , this );
265+ success = true ;
266+ }
267+ finally {
268+ eventManager .completeEntityDeleteEvent ( event , id , persister .getEntityName (), success , this );
269+ }
245270 firePostDelete (entity , id , persister );
246271 final StatisticsImplementor statistics = getFactory ().getStatistics ();
247272 if ( statistics .isStatisticsEnabled () ) {
@@ -250,6 +275,27 @@ public void delete(String entityName, Object entity) {
250275 }
251276 }
252277
278+ private void removeCollections (Object entity , Object id , EntityPersister persister ) {
279+ forEachOwnedCollection ( entity , id , persister ,
280+ (descriptor , collection ) -> {
281+ final EventManager eventManager = getEventManager ();
282+ final HibernateMonitoringEvent event = eventManager .beginCollectionRemoveEvent ();
283+ boolean success = false ;
284+ try {
285+ descriptor .remove ( id , this );
286+ success = true ;
287+ }
288+ finally {
289+ eventManager .completeCollectionRemoveEvent ( event , id , descriptor .getRole (), success , this );
290+ }
291+
292+ final StatisticsImplementor statistics = getFactory ().getStatistics ();
293+ if ( statistics .isStatisticsEnabled () ) {
294+ statistics .removeCollection ( descriptor .getRole () );
295+ }
296+ } );
297+ }
298+
253299
254300 // updates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
255301
@@ -289,19 +335,18 @@ public void update(String entityName, Object entity) {
289335 oldVersion = null ;
290336 }
291337 if ( !firePreUpdate (entity , id , state , persister ) ) {
292- getInterceptor ()
293- .onUpdate ( entity , id , state , persister .getPropertyNames (), persister .getPropertyTypes () );
294- persister .getUpdateCoordinator ().update ( entity , id , null , state , oldVersion , null , null , false , this );
295- forEachOwnedCollection ( entity , id , persister ,
296- (descriptor , collection ) -> {
297- // TODO: can we do better here?
298- descriptor .remove ( id , this );
299- descriptor .recreate ( collection , id , this );
300- final StatisticsImplementor statistics = getFactory ().getStatistics ();
301- if ( statistics .isStatisticsEnabled () ) {
302- statistics .updateCollection ( descriptor .getRole () );
303- }
304- } );
338+ getInterceptor ().onUpdate ( entity , id , state , persister .getPropertyNames (), persister .getPropertyTypes () );
339+ final EventManager eventManager = getEventManager ();
340+ final HibernateMonitoringEvent event = eventManager .beginEntityUpdateEvent ();
341+ boolean success = false ;
342+ try {
343+ persister .getUpdateCoordinator ().update ( entity , id , null , state , oldVersion , null , null , false , this );
344+ success = true ;
345+ }
346+ finally {
347+ eventManager .completeEntityUpdateEvent ( event , id , persister .getEntityName (), success , this );
348+ }
349+ removeAndRecreateCollections ( entity , id , persister );
305350 firePostUpdate (entity , id , state , persister );
306351 final StatisticsImplementor statistics = getFactory ().getStatistics ();
307352 if ( statistics .isStatisticsEnabled () ) {
@@ -310,6 +355,28 @@ public void update(String entityName, Object entity) {
310355 }
311356 }
312357
358+ private void removeAndRecreateCollections (Object entity , Object id , EntityPersister persister ) {
359+ forEachOwnedCollection ( entity , id , persister ,
360+ (descriptor , collection ) -> {
361+ final EventManager eventManager = getEventManager ();
362+ final HibernateMonitoringEvent event = eventManager .beginCollectionRemoveEvent ();
363+ boolean success = false ;
364+ try {
365+ // TODO: can we do better here?
366+ descriptor .remove ( id , this );
367+ descriptor .recreate ( collection , id , this );
368+ success = true ;
369+ }
370+ finally {
371+ eventManager .completeCollectionRemoveEvent ( event , id , descriptor .getRole (), success , this );
372+ }
373+ final StatisticsImplementor statistics = getFactory ().getStatistics ();
374+ if ( statistics .isStatisticsEnabled () ) {
375+ statistics .updateCollection ( descriptor .getRole () );
376+ }
377+ } );
378+ }
379+
313380 @ Override
314381 public void upsert (Object entity ) {
315382 upsert ( null , entity );
@@ -336,21 +403,23 @@ public void upsert(String entityName, Object entity) {
336403 final Object id = idToUpsert ( entity , persister );
337404 final Object [] state = persister .getValues ( entity );
338405 if ( !firePreUpsert (entity , id , state , persister ) ) {
339- getInterceptor ()
340- .onUpsert ( entity , id , state , persister .getPropertyNames (), persister .getPropertyTypes () );
406+ getInterceptor ().onUpsert ( entity , id , state , persister .getPropertyNames (), persister .getPropertyTypes () );
341407 final Object oldVersion = versionToUpsert ( entity , persister , state );
342- persister .getMergeCoordinator ().update ( entity , id , null , state , oldVersion , null , null , false , this );
343- // TODO: statistics for upsert!
344- forEachOwnedCollection ( entity , id , persister ,
345- (descriptor , collection ) -> {
346- // TODO: can we do better here?
347- descriptor .remove ( id , this );
348- descriptor .recreate ( collection , id , this );
349- final StatisticsImplementor statistics = getFactory ().getStatistics ();
350- if ( statistics .isStatisticsEnabled () ) {
351- statistics .updateCollection ( descriptor .getRole () );
352- }
353- } );
408+ final EventManager eventManager = getEventManager ();
409+ final HibernateMonitoringEvent event = eventManager .beginEntityUpsertEvent ();
410+ boolean success = false ;
411+ try {
412+ persister .getMergeCoordinator ().update ( entity , id , null , state , oldVersion , null , null , false , this );
413+ success = true ;
414+ }
415+ finally {
416+ eventManager .completeEntityUpsertEvent ( event , id , persister .getEntityName (), success , this );
417+ }
418+ final StatisticsImplementor statistics = getFactory ().getStatistics ();
419+ if ( statistics .isStatisticsEnabled () ) {
420+ statistics .upsertEntity ( persister .getEntityName () );
421+ }
422+ removeAndRecreateCollections ( entity , id , persister );
354423 firePostUpsert (entity , id , state , persister );
355424 }
356425 }
0 commit comments