Skip to content

Commit 1b3f0f6

Browse files
dreab8DavideD
authored andcommitted
[#2534] session.find() will not respect NOWAIT locks starting from HR 3.1
1 parent 0c039c5 commit 1b3f0f6

File tree

4 files changed

+60
-11
lines changed

4 files changed

+60
-11
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public <R> SelectionQuery<R> createNativeQuery(String queryString, ResultSetMapp
221221

222222
@Override
223223
public <T> Uni<T> find(Class<T> entityClass, Object primaryKey) {
224-
return uni( () -> delegate.reactiveFind( entityClass, primaryKey, null, null ) );
224+
return uni( () -> delegate.reactiveFind( entityClass, primaryKey ) );
225225
}
226226

227227
@Override
@@ -236,7 +236,7 @@ public <T> Uni<T> find(Class<T> entityClass, Identifier<T> id) {
236236

237237
@Override
238238
public <T> Uni<T> find(Class<T> entityClass, Object primaryKey, LockMode lockMode) {
239-
return uni( () -> delegate.reactiveFind( entityClass, primaryKey, new LockOptions( lockMode ), null ) );
239+
return uni( () -> delegate.reactiveFind( entityClass, primaryKey, lockMode, null ) );
240240
}
241241

242242
@Override
@@ -252,7 +252,7 @@ public <T> Uni<T> find(Class<T> entityClass, Object primaryKey, LockOptions lock
252252
@Override
253253
public <T> Uni<T> find(EntityGraph<T> entityGraph, Object id) {
254254
Class<T> entityClass = ( (RootGraph<T>) entityGraph ).getGraphedType().getJavaType();
255-
return uni( () -> delegate.reactiveFind( entityClass, id, null, entityGraph ) );
255+
return uni( () -> delegate.reactiveFind( entityClass, id, (LockMode) null, entityGraph ) );
256256
}
257257

258258
@Override
@@ -297,7 +297,7 @@ public Uni<Void> refresh(Object entity) {
297297

298298
@Override
299299
public Uni<Void> refresh(Object entity, LockMode lockMode) {
300-
return uni( () -> delegate.reactiveRefresh( entity, new LockOptions( lockMode ) ) );
300+
return uni( () -> delegate.reactiveRefresh( entity, lockMode ) );
301301
}
302302

303303
@Override
@@ -317,7 +317,7 @@ public Uni<Void> refreshAll(Object... entity) {
317317

318318
@Override
319319
public Uni<Void> lock(Object entity, LockMode lockMode) {
320-
return uni( () -> delegate.reactiveLock( entity, new LockOptions( lockMode ) ) );
320+
return uni( () -> delegate.reactiveLock( entity, lockMode ) );
321321
}
322322

323323
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveSession.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,33 @@ public interface ReactiveSession extends ReactiveQueryProducer, ReactiveSharedSe
7575

7676
CompletionStage<Void> reactiveRefresh(Object entity, LockOptions lockMode);
7777

78+
default CompletionStage<Void> reactiveRefresh(Object entity, LockMode lockMode) {
79+
return reactiveRefresh( entity, new LockOptions( lockMode ) );
80+
}
81+
7882
CompletionStage<Void> reactiveRefresh(Object child, RefreshContext refreshedAlready);
7983

8084
CompletionStage<Void> reactiveLock(Object entity, LockOptions lockMode);
8185

86+
default CompletionStage<Void> reactiveLock(Object entity, LockMode lockMode){
87+
return reactiveLock( entity, new LockOptions( lockMode ) );
88+
}
89+
8290
CompletionStage<Void> reactiveLock(String entityName, Object entity, LockOptions lockMode);
8391

8492
<T> CompletionStage<T> reactiveGet(Class<T> entityClass, Object id);
8593

8694
<T> CompletionStage<T> reactiveFind(Class<T> entityClass, Object id, LockOptions lockOptions, EntityGraph<T> fetchGraph);
8795

96+
default <T> CompletionStage<T> reactiveFind(Class<T> entityClass, Object id){
97+
return reactiveFind( entityClass, id, (LockOptions) null, null );
98+
}
99+
100+
default <T> CompletionStage<T> reactiveFind(Class<T> entityClass, Object id, LockMode lockMode, EntityGraph<T> fetchGraph ){
101+
return reactiveFind( entityClass, id, new LockOptions( lockMode ), fetchGraph );
102+
}
103+
104+
88105
<T> CompletionStage<List<T>> reactiveFind(Class<T> entityClass, Object... ids);
89106

90107
<T> CompletionStage<T> reactiveFind(Class<T> entityClass, Map<String,Object> naturalIds);

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,11 @@ public CompletionStage<Void> reactiveRefresh(Object entity, LockOptions lockOpti
11331133
return fireRefresh( new RefreshEvent( entity, lockOptions, this ) );
11341134
}
11351135

1136+
@Override
1137+
public CompletionStage<Void> reactiveRefresh(Object entity, LockMode lockMode) {
1138+
return reactiveRefresh( entity, toLockOptions( lockMode ) );
1139+
}
1140+
11361141
@Override
11371142
public CompletionStage<Void> reactiveRefresh(Object object, RefreshContext refreshedAlready) {
11381143
checkOpenOrWaitingForAutoClose();
@@ -1193,6 +1198,11 @@ public CompletionStage<Void> reactiveLock(Object object, LockOptions lockOptions
11931198
return fireLock( new LockEvent( object, lockOptions, this ) );
11941199
}
11951200

1201+
@Override
1202+
public CompletionStage<Void> reactiveLock(Object entity, LockMode lockMode) {
1203+
return reactiveLock( entity, toLockOptions( lockMode ) );
1204+
}
1205+
11961206
@Override
11971207
public CompletionStage<Void> reactiveLock(String entityName, Object object, LockOptions lockOptions) {
11981208
checkOpen();
@@ -1254,6 +1264,11 @@ public <T> CompletionStage<T> reactiveFind(
12541264
} );
12551265
}
12561266

1267+
@Override
1268+
public <T> CompletionStage<T> reactiveFind(Class<T> entityClass, Object id, LockMode lockMode, EntityGraph<T> fetchGraph){
1269+
return reactiveFind( entityClass, id, toLockOptions( lockMode ), fetchGraph );
1270+
}
1271+
12571272
private <T> CompletionStage<T> handleReactiveFindException(
12581273
Class<T> entityClass,
12591274
Object primaryKey,
@@ -1318,7 +1333,7 @@ public <T> CompletionStage<T> reactiveFind(Class<T> entityClass, Map<String, Obj
13181333
final Object normalizedIdValues = persister.getNaturalIdMapping().normalizeInput( ids );
13191334
return new NaturalIdLoadAccessImpl<T>( this, persister, requireEntityPersister( entityClass ) )
13201335
.resolveNaturalId( normalizedIdValues )
1321-
.thenCompose( id -> reactiveFind( entityClass, id, null, null ) );
1336+
.thenCompose( id -> reactiveFind( entityClass, id ) );
13221337
}
13231338

13241339
private <T> ReactiveEntityPersister entityPersister(Class<T> entityClass) {
@@ -1811,4 +1826,21 @@ public <T> RootGraphImplementor<T> getEntityGraph(Class<T> entity, String name)
18111826
}
18121827
return (RootGraphImplementor<T>) entityGraph;
18131828
}
1829+
1830+
/**
1831+
* Convert a {@link LockMode} into a {@link LockOptions} object.
1832+
* <p>
1833+
* We need to make sure that we use the method {@link LockOptions#setLockMode(LockMode)} for the conversion
1834+
* because it also set a {@link LockOptions#timeout} that will affect the way SQL queries are generated.
1835+
* There's also the constructor {@link LockOptions#LockOptions(LockMode)}, but it doesn't set a time-out
1836+
* causing some generated SQL queries to not have the expected syntax (for example, it won't apply
1837+
* the "nowait" clause in PostgreSQL, even if set to {@link LockMode#UPGRADE_NOWAIT} ).
1838+
* </p>
1839+
* @see <a href="https://github.com/hibernate/hibernate-reactive/issues/2534">Hibernate Reactive issue 2534</a>
1840+
*/
1841+
private static LockOptions toLockOptions(LockMode lockMode) {
1842+
return lockMode == null
1843+
? null
1844+
: new LockOptions().setLockMode( lockMode );
1845+
}
18141846
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageSessionImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert) {
135135

136136
@Override
137137
public <T> CompletionStage<T> find(Class<T> entityClass, Object primaryKey) {
138-
return delegate.reactiveFind( entityClass, primaryKey, null, null );
138+
return delegate.reactiveFind( entityClass, primaryKey );
139139
}
140140

141141
@Override
@@ -150,7 +150,7 @@ public <T> CompletionStage<T> find(Class<T> entityClass, Identifier<T> id) {
150150

151151
@Override
152152
public <T> CompletionStage<T> find(Class<T> entityClass, Object primaryKey, LockMode lockMode) {
153-
return delegate.reactiveFind( entityClass, primaryKey, new LockOptions( lockMode ), null );
153+
return delegate.reactiveFind( entityClass, primaryKey, lockMode, null );
154154
}
155155

156156
@Override
@@ -167,7 +167,7 @@ public <T> CompletionStage<T> find(Class<T> entityClass, Object primaryKey, Lock
167167
@Override
168168
public <T> CompletionStage<T> find(EntityGraph<T> entityGraph, Object id) {
169169
Class<T> entityClass = ( (RootGraph<T>) entityGraph ).getGraphedType().getJavaType();
170-
return delegate.reactiveFind( entityClass, id, null, entityGraph );
170+
return delegate.reactiveFind( entityClass, id, (LockOptions) null, entityGraph );
171171
}
172172

173173
@Override
@@ -212,7 +212,7 @@ public CompletionStage<Void> refresh(Object entity) {
212212

213213
@Override
214214
public CompletionStage<Void> refresh(Object entity, LockMode lockMode) {
215-
return delegate.reactiveRefresh( entity, new LockOptions(lockMode) );
215+
return delegate.reactiveRefresh( entity, lockMode );
216216
}
217217

218218
@Override
@@ -232,7 +232,7 @@ public CompletionStage<Void> refresh(Object... entity) {
232232

233233
@Override
234234
public CompletionStage<Void> lock(Object entity, LockMode lockMode) {
235-
return delegate.reactiveLock( entity, new LockOptions(lockMode) );
235+
return delegate.reactiveLock( entity, lockMode );
236236
}
237237

238238
@Override

0 commit comments

Comments
 (0)