Skip to content

Commit a222c51

Browse files
committed
HHH-18942 JFR events for entity insert/update/delete
1 parent ec2ecfd commit a222c51

File tree

10 files changed

+337
-24
lines changed

10 files changed

+337
-24
lines changed

hibernate-core/src/main/java/org/hibernate/action/internal/EntityDeleteAction.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import org.hibernate.engine.spi.PersistenceContext;
1414
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1515
import org.hibernate.event.service.spi.EventListenerGroup;
16+
import org.hibernate.event.spi.EventManager;
1617
import org.hibernate.event.spi.EventSource;
18+
import org.hibernate.event.spi.HibernateMonitoringEvent;
1719
import org.hibernate.event.spi.PostCommitDeleteEventListener;
1820
import org.hibernate.event.spi.PostDeleteEvent;
1921
import org.hibernate.event.spi.PostDeleteEventListener;
@@ -126,7 +128,16 @@ public void execute() throws HibernateException {
126128
final Object ck = lockCacheItem();
127129

128130
if ( !isCascadeDeleteEnabled && !veto ) {
129-
persister.getDeleteCoordinator().delete( instance, id, version, session );
131+
final EventManager eventManager = session.getEventManager();
132+
final HibernateMonitoringEvent event = eventManager.beginEntityDeleteEvent();
133+
boolean success = false;
134+
try {
135+
persister.getDeleteCoordinator().delete( instance, id, version, session );
136+
success = true;
137+
}
138+
finally {
139+
eventManager.completeEntityDeleteEvent( event, id, persister.getEntityName(), success, session );
140+
}
130141
}
131142

132143
if ( isInstanceLoaded() ) {

hibernate-core/src/main/java/org/hibernate/action/internal/EntityIdentityInsertAction.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
import org.hibernate.engine.spi.PersistenceContext;
1111
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1212
import org.hibernate.event.service.spi.EventListenerGroup;
13+
import org.hibernate.event.spi.EventManager;
1314
import org.hibernate.event.spi.EventSource;
15+
import org.hibernate.event.spi.HibernateMonitoringEvent;
1416
import org.hibernate.event.spi.PostCommitInsertEventListener;
1517
import org.hibernate.event.spi.PostInsertEvent;
1618
import org.hibernate.event.spi.PostInsertEventListener;
@@ -80,12 +82,18 @@ public void execute() throws HibernateException {
8082
// else inserted the same pk first, the insert would fail
8183

8284
if ( !isVeto() ) {
83-
final GeneratedValues generatedValues = persister.getInsertCoordinator().insert(
84-
instance,
85-
getState(),
86-
session
87-
);
88-
generatedId = castNonNull( generatedValues ).getGeneratedValue( persister.getIdentifierMapping() );
85+
final EventManager eventManager = session.getEventManager();
86+
final HibernateMonitoringEvent event = eventManager.beginEntityInsertEvent();
87+
boolean success = false;
88+
final GeneratedValues generatedValues;
89+
try {
90+
generatedValues = persister.getInsertCoordinator().insert( instance, getState(), session );
91+
generatedId = castNonNull( generatedValues ).getGeneratedValue( persister.getIdentifierMapping() );
92+
success = true;
93+
}
94+
finally {
95+
eventManager.completeEntityInsertEvent( event, generatedId, persister.getEntityName(), success, session );
96+
}
8997
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
9098
if ( persister.getRowIdMapping() != null ) {
9199
rowId = generatedValues.getGeneratedValue( persister.getRowIdMapping() );

hibernate-core/src/main/java/org/hibernate/action/internal/EntityInsertAction.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,17 @@ public void execute() throws HibernateException {
105105
if ( !veto ) {
106106
final EntityPersister persister = getPersister();
107107
final Object instance = getInstance();
108-
final GeneratedValues generatedValues = persister.getInsertCoordinator().insert(
109-
instance,
110-
id,
111-
getState(),
112-
session
113-
);
108+
final EventManager eventManager = session.getEventManager();
109+
final HibernateMonitoringEvent event = eventManager.beginEntityInsertEvent();
110+
boolean success = false;
111+
final GeneratedValues generatedValues;
112+
try {
113+
generatedValues = persister.getInsertCoordinator().insert( instance, id, getState(), session );
114+
success = true;
115+
}
116+
finally {
117+
eventManager.completeEntityInsertEvent( event, id, persister.getEntityName(), success, session );
118+
}
114119
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
115120
final EntityEntry entry = persistenceContext.getEntry( instance );
116121
if ( entry == null ) {

hibernate-core/src/main/java/org/hibernate/action/internal/EntityUpdateAction.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,17 +164,27 @@ public void execute() throws HibernateException {
164164
final Object instance = getInstance();
165165
final Object previousVersion = getPreviousVersion();
166166
final Object ck = lockCacheItem( previousVersion );
167-
final GeneratedValues generatedValues = persister.getUpdateCoordinator().update(
168-
instance,
169-
id,
170-
rowId,
171-
state,
172-
previousVersion,
173-
previousState,
174-
dirtyFields,
175-
hasDirtyCollection,
176-
session
177-
);
167+
final EventManager eventManager = session.getEventManager();
168+
final HibernateMonitoringEvent event = eventManager.beginEntityUpdateEvent();
169+
boolean success = false;
170+
final GeneratedValues generatedValues;
171+
try {
172+
generatedValues = persister.getUpdateCoordinator().update(
173+
instance,
174+
id,
175+
rowId,
176+
state,
177+
previousVersion,
178+
previousState,
179+
dirtyFields,
180+
hasDirtyCollection,
181+
session
182+
);
183+
success = true;
184+
}
185+
finally {
186+
eventManager.completeEntityUpdateEvent( event, id, persister.getEntityName(), success, session );
187+
}
178188
final EntityEntry entry = session.getPersistenceContextInternal().getEntry( instance );
179189
if ( entry == null ) {
180190
throw new AssertionFailure( "possible non thread safe access to session" );

hibernate-core/src/main/java/org/hibernate/event/internal/EmptyEventManager.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,46 @@ public void completePrePartialFlush(
234234
SharedSessionContractImplementor session) {
235235

236236
}
237+
238+
@Override
239+
public HibernateMonitoringEvent beginEntityInsertEvent() {
240+
return null;
241+
}
242+
243+
@Override
244+
public void completeEntityInsertEvent(
245+
HibernateMonitoringEvent event,
246+
Object id, String entityName,
247+
boolean success,
248+
SharedSessionContractImplementor session) {
249+
250+
}
251+
252+
@Override
253+
public HibernateMonitoringEvent beginEntityUpdateEvent() {
254+
return null;
255+
}
256+
257+
@Override
258+
public void completeEntityUpdateEvent(
259+
HibernateMonitoringEvent event,
260+
Object id, String entityName,
261+
boolean success,
262+
SharedSessionContractImplementor session) {
263+
264+
}
265+
266+
@Override
267+
public HibernateMonitoringEvent beginEntityDeleteEvent() {
268+
return null;
269+
}
270+
271+
@Override
272+
public void completeEntityDeleteEvent(
273+
HibernateMonitoringEvent event,
274+
Object id, String entityName,
275+
boolean success,
276+
SharedSessionContractImplementor session) {
277+
278+
}
237279
}

hibernate-core/src/main/java/org/hibernate/event/spi/EventManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,18 @@ void completePrePartialFlush(
157157
SharedSessionContractImplementor session
158158
);
159159

160+
HibernateMonitoringEvent beginEntityInsertEvent();
161+
162+
void completeEntityInsertEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session);
163+
164+
HibernateMonitoringEvent beginEntityUpdateEvent();
165+
166+
void completeEntityUpdateEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session);
167+
168+
HibernateMonitoringEvent beginEntityDeleteEvent();
169+
170+
void completeEntityDeleteEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session);
171+
160172
enum CacheActionDescription {
161173
ENTITY_INSERT( "Entity Insert" ),
162174
ENTITY_AFTER_INSERT( "Entity After Insert" ),
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.event.jfr.internal;
6+
7+
import jdk.jfr.Category;
8+
import jdk.jfr.Description;
9+
import jdk.jfr.Event;
10+
import jdk.jfr.Label;
11+
import jdk.jfr.Name;
12+
import jdk.jfr.StackTrace;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
14+
import org.hibernate.internal.build.AllowNonPortable;
15+
16+
@Name(EntityDeleteEvent.NAME)
17+
@Label("Entity Delete")
18+
@Category("Hibernate ORM")
19+
@Description("Entity Delete")
20+
@StackTrace(false)
21+
@AllowNonPortable
22+
public class EntityDeleteEvent extends Event implements HibernateMonitoringEvent {
23+
public static final String NAME = "org.hibernate.orm.EntityDeleteEvent";
24+
25+
@Label("Session Identifier")
26+
public String sessionIdentifier;
27+
28+
@Label("Entity Identifier")
29+
public String id;
30+
31+
@Label("Entity Name")
32+
public String entityName;
33+
34+
@Label("Success")
35+
public boolean success;
36+
37+
@Override
38+
public String toString() {
39+
return NAME;
40+
}
41+
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.event.jfr.internal;
6+
7+
import jdk.jfr.Category;
8+
import jdk.jfr.Description;
9+
import jdk.jfr.Event;
10+
import jdk.jfr.Label;
11+
import jdk.jfr.Name;
12+
import jdk.jfr.StackTrace;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
14+
import org.hibernate.internal.build.AllowNonPortable;
15+
16+
@Name(EntityInsertEvent.NAME)
17+
@Label("Entity Insert")
18+
@Category("Hibernate ORM")
19+
@Description("Entity Insert")
20+
@StackTrace(false)
21+
@AllowNonPortable
22+
public class EntityInsertEvent extends Event implements HibernateMonitoringEvent {
23+
public static final String NAME = "org.hibernate.orm.EntityInsertEvent";
24+
25+
@Label("Session Identifier")
26+
public String sessionIdentifier;
27+
28+
@Label("Entity Identifier")
29+
public String id;
30+
31+
@Label("Entity Name")
32+
public String entityName;
33+
34+
@Label("Success")
35+
public boolean success;
36+
37+
@Override
38+
public String toString() {
39+
return NAME;
40+
}
41+
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.event.jfr.internal;
6+
7+
import jdk.jfr.Category;
8+
import jdk.jfr.Description;
9+
import jdk.jfr.Event;
10+
import jdk.jfr.Label;
11+
import jdk.jfr.Name;
12+
import jdk.jfr.StackTrace;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
14+
import org.hibernate.internal.build.AllowNonPortable;
15+
16+
@Name(EntityUpdateEvent.NAME)
17+
@Label("Entity Update")
18+
@Category("Hibernate ORM")
19+
@Description("Entity Update")
20+
@StackTrace(false)
21+
@AllowNonPortable
22+
public class EntityUpdateEvent extends Event implements HibernateMonitoringEvent {
23+
public static final String NAME = "org.hibernate.orm.EntityUpdateEvent";
24+
25+
@Label("Session Identifier")
26+
public String sessionIdentifier;
27+
28+
@Label("Entity Identifier")
29+
public String id;
30+
31+
@Label("Entity Name")
32+
public String entityName;
33+
34+
@Label("Success")
35+
public boolean success;
36+
37+
@Override
38+
public String toString() {
39+
return NAME;
40+
}
41+
42+
}

0 commit comments

Comments
 (0)