1
1
package io .quarkus .hibernate .reactive .panache .common .runtime ;
2
2
3
3
import java .util .ArrayList ;
4
+ import java .util .Arrays ;
4
5
import java .util .Collections ;
5
6
import java .util .List ;
6
7
import java .util .Map ;
7
8
import java .util .Map .Entry ;
9
+ import java .util .stream .Collectors ;
8
10
import java .util .stream .Stream ;
9
11
10
12
import jakarta .persistence .LockModeType ;
18
20
import io .quarkus .panache .hibernate .common .runtime .PanacheJpaUtil ;
19
21
import io .smallrye .mutiny .Uni ;
20
22
23
+ import static io .quarkus .hibernate .orm .runtime .PersistenceUnitUtil .DEFAULT_PERSISTENCE_UNIT_NAME ;
24
+
21
25
public abstract class AbstractJpaOperations <PanacheQueryType > {
26
+ private static volatile Map <String , String > entityToPersistenceUnit = Collections .emptyMap ();
27
+
28
+ public static void setEntityToPersistenceUnit (Map <String , String > map ) {
29
+ entityToPersistenceUnit = Collections .unmodifiableMap (map );
30
+ }
22
31
23
32
// FIXME: make it configurable?
24
33
static final long TIMEOUT_MS = 5000 ;
@@ -34,7 +43,7 @@ protected abstract PanacheQueryType createPanacheQuery(Uni<Mutiny.Session> sessi
34
43
// Instance methods
35
44
36
45
public Uni <Void > persist (Object entity ) {
37
- return persist (getSession (), entity );
46
+ return persist (getSession (entity . getClass () ), entity );
38
47
}
39
48
40
49
public Uni <Void > persist (Uni <Mutiny .Session > sessionUni , Object entity ) {
@@ -67,20 +76,27 @@ public Uni<Void> persist(Stream<?> entities) {
67
76
}
68
77
69
78
public Uni <Void > persist (Object ... entities ) {
70
- return getSession ().chain (session -> session .persistAll (entities ));
79
+ Map <String , List <Object >> sessions = Arrays .stream (entities )
80
+ .collect (Collectors .groupingBy (e -> entityToPersistenceUnit .get (e .getClass ().getName ())));
81
+
82
+ List <Uni <Void >> results = new ArrayList <>();
83
+ for (Entry <String , List <Object >> entry : sessions .entrySet ()) {
84
+ results .add (getSession (entry .getKey ()).chain (session -> session .persistAll (entry .getValue ().toArray ())));
85
+ }
86
+
87
+ return Uni .combine ().all ().unis (results ).discardItems ();
71
88
}
72
89
73
90
public Uni <Void > delete (Object entity ) {
74
- return getSession ().chain (session -> session .remove (entity ));
91
+ return getSession (entity . getClass () ).chain (session -> session .remove (entity ));
75
92
}
76
93
77
- public boolean isPersistent (Object entity ) {
78
- Mutiny .Session current = SessionOperations .getCurrentSession ();
79
- return current != null ? current .contains (entity ) : false ;
94
+ public Uni <Boolean > isPersistent (Object entity ) {
95
+ return getSession (entity .getClass ()).map (session -> session .contains (entity ));
80
96
}
81
97
82
- public Uni <Void > flush () {
83
- return getSession ().chain (Session ::flush );
98
+ public Uni <Void > flush (Object entity ) {
99
+ return getSession (entity . getClass () ).chain (Session ::flush );
84
100
}
85
101
86
102
public int paramCount (Object [] params ) {
@@ -95,11 +111,11 @@ public int paramCount(Map<String, Object> params) {
95
111
// Queries
96
112
97
113
public Uni <?> findById (Class <?> entityClass , Object id ) {
98
- return getSession ().chain (session -> session .find (entityClass , id ));
114
+ return getSession (entityClass ).chain (session -> session .find (entityClass , id ));
99
115
}
100
116
101
117
public Uni <?> findById (Class <?> entityClass , Object id , LockModeType lockModeType ) {
102
- return getSession ()
118
+ return getSession (entityClass )
103
119
.chain (session -> session .find (entityClass , id , LockModeConverter .convertToLockMode (lockModeType )));
104
120
}
105
121
@@ -108,7 +124,7 @@ public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Object..
108
124
}
109
125
110
126
public PanacheQueryType find (Class <?> entityClass , String panacheQuery , Sort sort , Object ... params ) {
111
- Uni <Mutiny .Session > session = getSession ();
127
+ Uni <Mutiny .Session > session = getSession (entityClass );
112
128
if (PanacheJpaUtil .isNamedQuery (panacheQuery )) {
113
129
String namedQuery = panacheQuery .substring (1 );
114
130
if (sort != null ) {
@@ -128,7 +144,7 @@ public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Map<Stri
128
144
}
129
145
130
146
public PanacheQueryType find (Class <?> entityClass , String panacheQuery , Sort sort , Map <String , Object > params ) {
131
- Uni <Mutiny .Session > session = getSession ();
147
+ Uni <Mutiny .Session > session = getSession (entityClass );
132
148
if (PanacheJpaUtil .isNamedQuery (panacheQuery )) {
133
149
String namedQuery = panacheQuery .substring (1 );
134
150
if (sort != null ) {
@@ -177,13 +193,13 @@ public Uni<List<?>> list(Class<?> entityClass, String query, Sort sort, Paramete
177
193
178
194
public PanacheQueryType findAll (Class <?> entityClass ) {
179
195
String query = "FROM " + PanacheJpaUtil .getEntityName (entityClass );
180
- Uni <Mutiny .Session > session = getSession ();
196
+ Uni <Mutiny .Session > session = getSession (entityClass );
181
197
return createPanacheQuery (session , query , null , null , null );
182
198
}
183
199
184
200
public PanacheQueryType findAll (Class <?> entityClass , Sort sort ) {
185
201
String query = "FROM " + PanacheJpaUtil .getEntityName (entityClass );
186
- Uni <Mutiny .Session > session = getSession ();
202
+ Uni <Mutiny .Session > session = getSession (entityClass );
187
203
return createPanacheQuery (session , query , null , PanacheJpaUtil .toOrderBy (sort ), null );
188
204
}
189
205
@@ -196,7 +212,7 @@ public Uni<List<?>> listAll(Class<?> entityClass, Sort sort) {
196
212
}
197
213
198
214
public Uni <Long > count (Class <?> entityClass ) {
199
- return getSession ()
215
+ return getSession (entityClass )
200
216
.chain (session -> session
201
217
.createSelectionQuery ("FROM " + PanacheJpaUtil .getEntityName (entityClass ), entityClass )
202
218
.getResultCount ());
@@ -206,13 +222,13 @@ public Uni<Long> count(Class<?> entityClass) {
206
222
public Uni <Long > count (Class <?> entityClass , String panacheQuery , Object ... params ) {
207
223
208
224
if (PanacheJpaUtil .isNamedQuery (panacheQuery ))
209
- return (Uni ) getSession ().chain (session -> {
225
+ return (Uni ) getSession (entityClass ).chain (session -> {
210
226
String namedQueryName = panacheQuery .substring (1 );
211
227
NamedQueryUtil .checkNamedQuery (entityClass , namedQueryName );
212
228
return bindParameters (session .createNamedQuery (namedQueryName , Long .class ), params ).getSingleResult ();
213
229
});
214
230
215
- return getSession ().chain (session -> bindParameters (
231
+ return getSession (entityClass ).chain (session -> bindParameters (
216
232
session .createSelectionQuery (PanacheJpaUtil .createQueryForCount (entityClass , panacheQuery , paramCount (params )),
217
233
Object .class ),
218
234
params ).getResultCount ())
@@ -223,13 +239,13 @@ public Uni<Long> count(Class<?> entityClass, String panacheQuery, Object... para
223
239
public Uni <Long > count (Class <?> entityClass , String panacheQuery , Map <String , Object > params ) {
224
240
225
241
if (PanacheJpaUtil .isNamedQuery (panacheQuery ))
226
- return getSession ().chain (session -> {
242
+ return getSession (entityClass ).chain (session -> {
227
243
String namedQueryName = panacheQuery .substring (1 );
228
244
NamedQueryUtil .checkNamedQuery (entityClass , namedQueryName );
229
245
return bindParameters (session .createNamedQuery (namedQueryName , Long .class ), params ).getSingleResult ();
230
246
});
231
247
232
- return getSession ().chain (session -> bindParameters (
248
+ return getSession (entityClass ).chain (session -> bindParameters (
233
249
session .createSelectionQuery (PanacheJpaUtil .createQueryForCount (entityClass , panacheQuery , paramCount (params )),
234
250
Object .class ),
235
251
params ).getResultCount ())
@@ -258,7 +274,7 @@ public Uni<Boolean> exists(Class<?> entityClass, String query, Parameters params
258
274
}
259
275
260
276
public Uni <Long > deleteAll (Class <?> entityClass ) {
261
- return getSession ().chain (
277
+ return getSession (entityClass ).chain (
262
278
session -> session .createMutationQuery ("DELETE FROM " + PanacheJpaUtil .getEntityName (entityClass ))
263
279
.executeUpdate ()
264
280
.map (Integer ::longValue ));
@@ -272,20 +288,20 @@ public Uni<Boolean> deleteById(Class<?> entityClass, Object id) {
272
288
if (entity == null ) {
273
289
return Uni .createFrom ().item (false );
274
290
}
275
- return getSession ().chain (session -> session .remove (entity ).map (v -> true ));
291
+ return getSession (entityClass ).chain (session -> session .remove (entity ).map (v -> true ));
276
292
});
277
293
}
278
294
279
295
public Uni <Long > delete (Class <?> entityClass , String panacheQuery , Object ... params ) {
280
296
281
297
if (PanacheJpaUtil .isNamedQuery (panacheQuery ))
282
- return getSession ().chain (session -> {
298
+ return getSession (entityClass ).chain (session -> {
283
299
String namedQueryName = panacheQuery .substring (1 );
284
300
NamedQueryUtil .checkNamedQuery (entityClass , namedQueryName );
285
301
return bindParameters (session .createNamedQuery (namedQueryName ), params ).executeUpdate ().map (Integer ::longValue );
286
302
});
287
303
288
- return getSession ().chain (session -> bindParameters (
304
+ return getSession (entityClass ).chain (session -> bindParameters (
289
305
session .createMutationQuery (PanacheJpaUtil .createDeleteQuery (entityClass , panacheQuery , paramCount (params ))),
290
306
params )
291
307
.executeUpdate ().map (Integer ::longValue ))
@@ -296,13 +312,13 @@ public Uni<Long> delete(Class<?> entityClass, String panacheQuery, Object... par
296
312
public Uni <Long > delete (Class <?> entityClass , String panacheQuery , Map <String , Object > params ) {
297
313
298
314
if (PanacheJpaUtil .isNamedQuery (panacheQuery ))
299
- return getSession ().chain (session -> {
315
+ return getSession (entityClass ).chain (session -> {
300
316
String namedQueryName = panacheQuery .substring (1 );
301
317
NamedQueryUtil .checkNamedQuery (entityClass , namedQueryName );
302
318
return bindParameters (session .createNamedQuery (namedQueryName ), params ).executeUpdate ().map (Integer ::longValue );
303
319
});
304
320
305
- return getSession ().chain (session -> bindParameters (
321
+ return getSession (entityClass ).chain (session -> bindParameters (
306
322
session .createMutationQuery (PanacheJpaUtil .createDeleteQuery (entityClass , panacheQuery , paramCount (params ))),
307
323
params )
308
324
.executeUpdate ().map (Integer ::longValue ))
@@ -322,7 +338,7 @@ public IllegalStateException implementationInjectionMissing() {
322
338
public Uni <Integer > executeUpdate (Class <?> entityClass , String panacheQuery , Object ... params ) {
323
339
324
340
if (PanacheJpaUtil .isNamedQuery (panacheQuery ))
325
- return (Uni ) getSession ().chain (session -> {
341
+ return (Uni ) getSession (entityClass ).chain (session -> {
326
342
String namedQueryName = panacheQuery .substring (1 );
327
343
NamedQueryUtil .checkNamedQuery (entityClass , namedQueryName );
328
344
return bindParameters (session .createNamedQuery (namedQueryName ), params ).executeUpdate ();
@@ -337,7 +353,7 @@ public Uni<Integer> executeUpdate(Class<?> entityClass, String panacheQuery, Obj
337
353
public Uni <Integer > executeUpdate (Class <?> entityClass , String panacheQuery , Map <String , Object > params ) {
338
354
339
355
if (PanacheJpaUtil .isNamedQuery (panacheQuery ))
340
- return (Uni ) getSession ().chain (session -> {
356
+ return (Uni ) getSession (entityClass ).chain (session -> {
341
357
String namedQueryName = panacheQuery .substring (1 );
342
358
NamedQueryUtil .checkNamedQuery (entityClass , namedQueryName );
343
359
return bindParameters (session .createNamedQuery (namedQueryName ), params ).executeUpdate ();
@@ -364,8 +380,19 @@ public Uni<Integer> update(Class<?> entityClass, String query, Object... params)
364
380
//
365
381
// Static helpers
366
382
383
+ // TODO Luca This returns only the default session
367
384
public static Uni <Mutiny .Session > getSession () {
368
- return SessionOperations .getSession ();
385
+ return getSession (DEFAULT_PERSISTENCE_UNIT_NAME );
386
+ }
387
+
388
+ public static Uni <Mutiny .Session > getSession (Class <?> clazz ) {
389
+ String className = clazz .getName ();
390
+ String persistenceUnitName = entityToPersistenceUnit .get (className );
391
+ return getSession (persistenceUnitName );
392
+ }
393
+
394
+ public static Uni <Mutiny .Session > getSession (String persistenceUnitName ) {
395
+ return SessionOperations .getSession (persistenceUnitName );
369
396
}
370
397
371
398
public static Mutiny .Query <?> bindParameters (Mutiny .Query <?> query , Object [] params ) {
@@ -396,10 +423,12 @@ public static <T extends Mutiny.AbstractQuery> T bindParameters(T query, Map<Str
396
423
}
397
424
398
425
public static Uni <Integer > executeUpdate (String query , Object ... params ) {
426
+ // TODO Luca not sure about this
399
427
return getSession ().chain (session -> bindParameters (session .createMutationQuery (query ), params )
400
428
.executeUpdate ());
401
429
}
402
430
431
+ // TODO Luca not sure about this
403
432
public static Uni <Integer > executeUpdate (String query , Map <String , Object > params ) {
404
433
return getSession ().chain (session -> bindParameters (session .createMutationQuery (query ), params )
405
434
.executeUpdate ());
0 commit comments