39
39
40
40
import static org .hibernate .pretty .MessageHelper .infoString ;
41
41
import static org .hibernate .reactive .util .impl .CompletionStages .completedFuture ;
42
+ import static org .hibernate .reactive .util .impl .CompletionStages .failedFuture ;
42
43
import static org .hibernate .reactive .util .impl .CompletionStages .voidFuture ;
43
44
44
45
public class DefaultReactiveLockEventListener extends AbstractReassociateEventListener
@@ -67,7 +68,7 @@ public CompletionStage<Void> reactiveOnLock(LockEvent event) throws HibernateExc
67
68
: !source .contains ( event .getObject () );
68
69
if ( detached ) {
69
70
// 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()" );
71
72
}
72
73
73
74
@@ -80,64 +81,55 @@ public CompletionStage<Void> reactiveOnLock(LockEvent event) throws HibernateExc
80
81
}
81
82
82
83
private CompletionStage <Void > reactiveOnLock (LockEvent event , Object entity ) {
83
-
84
84
final SessionImplementor source = event .getSession ();
85
85
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
+ }
86
90
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 ) {
90
97
final EntityPersister persister = source .getEntityPersister ( event .getEntityName (), entity );
91
98
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
+ }
105
110
);
106
-
107
111
}
108
- else {
109
- stage = completedFuture ( entry );
110
- }
111
-
112
- return stage .thenCompose ( e -> upgradeLock ( entity , e , event .getLockOptions (), event .getSession () ) );
112
+ return completedFuture ( entry );
113
113
}
114
114
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 ();
132
124
}
133
125
134
126
/**
135
127
* Performs a pessimistic lock upgrade on a given entity, if needed.
136
128
*
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.
139
131
* @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.
141
133
*/
142
134
protected CompletionStage <Void > upgradeLock (
143
135
Object object ,
@@ -165,7 +157,7 @@ protected CompletionStage<Void> upgradeLock(
165
157
);
166
158
}
167
159
168
- final ReactiveActionQueue actionQueue = ((ReactiveSession ) source ).getReactiveActionQueue ();
160
+ final ReactiveActionQueue actionQueue = ( (ReactiveSession ) source ).getReactiveActionQueue ();
169
161
switch ( requestedLockMode ) {
170
162
case OPTIMISTIC :
171
163
actionQueue .registerProcess ( new ReactiveEntityVerifyVersionProcess ( object ) );
@@ -184,9 +176,10 @@ protected CompletionStage<Void> upgradeLock(
184
176
}
185
177
}
186
178
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 ) {
190
183
191
184
final EntityPersister persister = entry .getPersister ();
192
185
@@ -209,7 +202,7 @@ private CompletionStage<Void> doUpgradeLock(Object object, EntityEntry entry,
209
202
}
210
203
211
204
try {
212
- return ((ReactiveEntityPersister ) persister )
205
+ return ( (ReactiveEntityPersister ) persister )
213
206
.reactiveLock (
214
207
entry .getId (),
215
208
entry .getVersion (),
0 commit comments