Skip to content

Commit e5bff9e

Browse files
committed
[hibernate#1947] Make DefautlReactiveLockEventListener#cascadeLock reactive
1 parent b7f8d1c commit e5bff9e

File tree

1 file changed

+42
-49
lines changed

1 file changed

+42
-49
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveLockEventListener.java

+42-49
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
import static org.hibernate.pretty.MessageHelper.infoString;
4141
import static org.hibernate.reactive.util.impl.CompletionStages.completedFuture;
42+
import static org.hibernate.reactive.util.impl.CompletionStages.failedFuture;
4243
import static org.hibernate.reactive.util.impl.CompletionStages.voidFuture;
4344

4445
public class DefaultReactiveLockEventListener extends AbstractReassociateEventListener
@@ -67,7 +68,7 @@ public CompletionStage<Void> reactiveOnLock(LockEvent event) throws HibernateExc
6768
: !source.contains( event.getObject() );
6869
if ( detached ) {
6970
// Hibernate Reactive doesn't support detached instances in refresh()
70-
throw new IllegalArgumentException("unmanaged instance passed to refresh()");
71+
throw new IllegalArgumentException( "unmanaged instance passed to refresh()" );
7172
}
7273

7374

@@ -80,64 +81,55 @@ public CompletionStage<Void> reactiveOnLock(LockEvent event) throws HibernateExc
8081
}
8182

8283
private CompletionStage<Void> reactiveOnLock(LockEvent event, Object entity) {
83-
8484
final SessionImplementor source = event.getSession();
8585
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
86+
final EntityEntry entry = persistenceContext.getEntry( entity );
87+
return lockEntry( event, entity, entry, source )
88+
.thenCompose( e -> upgradeLock( entity, e, event.getLockOptions(), event.getSession() ) );
89+
}
8690

87-
final EntityEntry entry = persistenceContext.getEntry(entity);
88-
final CompletionStage<EntityEntry> stage;
89-
if ( entry==null ) {
91+
private CompletionStage<EntityEntry> lockEntry(
92+
LockEvent event,
93+
Object entity,
94+
EntityEntry entry,
95+
SessionImplementor source) {
96+
if ( entry == null ) {
9097
final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
9198
final Object id = persister.getIdentifier( entity, source );
92-
stage = ForeignKeys.isNotTransient( event.getEntityName(), entity, Boolean.FALSE, source)
93-
.thenApply( trans -> {
94-
if (!trans) {
95-
throw new TransientObjectException(
96-
"cannot lock an unsaved transient instance: " +
97-
persister.getEntityName()
98-
);
99-
}
100-
101-
final EntityEntry e = reassociate( event, entity, id, persister );
102-
cascadeOnLock( event, persister, entity );
103-
return e;
104-
}
99+
return ForeignKeys.isNotTransient( event.getEntityName(), entity, Boolean.FALSE, source )
100+
.thenCompose( trans -> {
101+
if ( !trans ) {
102+
return failedFuture( new TransientObjectException(
103+
"cannot lock an unsaved transient instance: " + persister.getEntityName() ) );
104+
}
105+
106+
final EntityEntry e = reassociate( event, entity, id, persister );
107+
return cascadeOnLock( event, persister, entity )
108+
.thenApply( v -> e );
109+
}
105110
);
106-
107111
}
108-
else {
109-
stage = completedFuture( entry );
110-
}
111-
112-
return stage.thenCompose( e -> upgradeLock( entity, e, event.getLockOptions(), event.getSession() ) );
112+
return completedFuture( entry );
113113
}
114114

115-
private void cascadeOnLock(LockEvent event, EntityPersister persister, Object entity) {
116-
EventSource source = event.getSession();
117-
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
118-
persistenceContext.incrementCascadeLevel();
119-
try {
120-
new Cascade(
121-
CascadingActions.LOCK,
122-
CascadePoint.AFTER_LOCK,
123-
persister,
124-
entity,
125-
event.getLockOptions(),
126-
source
127-
).cascade();
128-
}
129-
finally {
130-
persistenceContext.decrementCascadeLevel();
131-
}
115+
private CompletionStage<Void> cascadeOnLock(LockEvent event, EntityPersister persister, Object entity) {
116+
return new Cascade<>(
117+
CascadingActions.LOCK,
118+
CascadePoint.AFTER_LOCK,
119+
persister,
120+
entity,
121+
event.getLockOptions(),
122+
event.getSession()
123+
).cascade();
132124
}
133125

134126
/**
135127
* Performs a pessimistic lock upgrade on a given entity, if needed.
136128
*
137-
* @param object The entity for which to upgrade the lock.
138-
* @param entry The entity's EntityEntry instance.
129+
* @param object The entity for which to upgrade the lock.
130+
* @param entry The entity's EntityEntry instance.
139131
* @param lockOptions contains the requested lock mode.
140-
* @param source The session which is the source of the event being processed.
132+
* @param source The session which is the source of the event being processed.
141133
*/
142134
protected CompletionStage<Void> upgradeLock(
143135
Object object,
@@ -165,7 +157,7 @@ protected CompletionStage<Void> upgradeLock(
165157
);
166158
}
167159

168-
final ReactiveActionQueue actionQueue = ((ReactiveSession) source).getReactiveActionQueue();
160+
final ReactiveActionQueue actionQueue = ( (ReactiveSession) source ).getReactiveActionQueue();
169161
switch ( requestedLockMode ) {
170162
case OPTIMISTIC:
171163
actionQueue.registerProcess( new ReactiveEntityVerifyVersionProcess( object ) );
@@ -184,9 +176,10 @@ protected CompletionStage<Void> upgradeLock(
184176
}
185177
}
186178

187-
private CompletionStage<Void> doUpgradeLock(Object object, EntityEntry entry,
188-
LockOptions lockOptions,
189-
EventSource source) {
179+
private CompletionStage<Void> doUpgradeLock(
180+
Object object, EntityEntry entry,
181+
LockOptions lockOptions,
182+
EventSource source) {
190183

191184
final EntityPersister persister = entry.getPersister();
192185

@@ -209,7 +202,7 @@ private CompletionStage<Void> doUpgradeLock(Object object, EntityEntry entry,
209202
}
210203

211204
try {
212-
return ((ReactiveEntityPersister) persister)
205+
return ( (ReactiveEntityPersister) persister )
213206
.reactiveLock(
214207
entry.getId(),
215208
entry.getVersion(),

0 commit comments

Comments
 (0)