Skip to content

Commit 08d41a4

Browse files
committed
Test passing but a few weird things
1 parent 51f0cf6 commit 08d41a4

File tree

9 files changed

+187
-81
lines changed

9 files changed

+187
-81
lines changed

extensions/panache/hibernate-reactive-panache-common/runtime/src/main/java/io/quarkus/hibernate/reactive/panache/common/runtime/AbstractJpaOperations.java

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.quarkus.hibernate.reactive.panache.common.runtime;
22

33
import java.util.ArrayList;
4+
import java.util.Arrays;
45
import java.util.Collections;
56
import java.util.List;
67
import java.util.Map;
78
import java.util.Map.Entry;
9+
import java.util.stream.Collectors;
810
import java.util.stream.Stream;
911

1012
import jakarta.persistence.LockModeType;
@@ -18,7 +20,14 @@
1820
import io.quarkus.panache.hibernate.common.runtime.PanacheJpaUtil;
1921
import io.smallrye.mutiny.Uni;
2022

23+
import static io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME;
24+
2125
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+
}
2231

2332
// FIXME: make it configurable?
2433
static final long TIMEOUT_MS = 5000;
@@ -34,7 +43,7 @@ protected abstract PanacheQueryType createPanacheQuery(Uni<Mutiny.Session> sessi
3443
// Instance methods
3544

3645
public Uni<Void> persist(Object entity) {
37-
return persist(getSession(), entity);
46+
return persist(getSession(entity.getClass()), entity);
3847
}
3948

4049
public Uni<Void> persist(Uni<Mutiny.Session> sessionUni, Object entity) {
@@ -67,20 +76,27 @@ public Uni<Void> persist(Stream<?> entities) {
6776
}
6877

6978
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();
7188
}
7289

7390
public Uni<Void> delete(Object entity) {
74-
return getSession().chain(session -> session.remove(entity));
91+
return getSession(entity.getClass()).chain(session -> session.remove(entity));
7592
}
7693

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));
8096
}
8197

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);
84100
}
85101

86102
public int paramCount(Object[] params) {
@@ -95,11 +111,11 @@ public int paramCount(Map<String, Object> params) {
95111
// Queries
96112

97113
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));
99115
}
100116

101117
public Uni<?> findById(Class<?> entityClass, Object id, LockModeType lockModeType) {
102-
return getSession()
118+
return getSession(entityClass)
103119
.chain(session -> session.find(entityClass, id, LockModeConverter.convertToLockMode(lockModeType)));
104120
}
105121

@@ -108,7 +124,7 @@ public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Object..
108124
}
109125

110126
public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Sort sort, Object... params) {
111-
Uni<Mutiny.Session> session = getSession();
127+
Uni<Mutiny.Session> session = getSession(entityClass);
112128
if (PanacheJpaUtil.isNamedQuery(panacheQuery)) {
113129
String namedQuery = panacheQuery.substring(1);
114130
if (sort != null) {
@@ -128,7 +144,7 @@ public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Map<Stri
128144
}
129145

130146
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);
132148
if (PanacheJpaUtil.isNamedQuery(panacheQuery)) {
133149
String namedQuery = panacheQuery.substring(1);
134150
if (sort != null) {
@@ -177,13 +193,13 @@ public Uni<List<?>> list(Class<?> entityClass, String query, Sort sort, Paramete
177193

178194
public PanacheQueryType findAll(Class<?> entityClass) {
179195
String query = "FROM " + PanacheJpaUtil.getEntityName(entityClass);
180-
Uni<Mutiny.Session> session = getSession();
196+
Uni<Mutiny.Session> session = getSession(entityClass);
181197
return createPanacheQuery(session, query, null, null, null);
182198
}
183199

184200
public PanacheQueryType findAll(Class<?> entityClass, Sort sort) {
185201
String query = "FROM " + PanacheJpaUtil.getEntityName(entityClass);
186-
Uni<Mutiny.Session> session = getSession();
202+
Uni<Mutiny.Session> session = getSession(entityClass);
187203
return createPanacheQuery(session, query, null, PanacheJpaUtil.toOrderBy(sort), null);
188204
}
189205

@@ -196,7 +212,7 @@ public Uni<List<?>> listAll(Class<?> entityClass, Sort sort) {
196212
}
197213

198214
public Uni<Long> count(Class<?> entityClass) {
199-
return getSession()
215+
return getSession(entityClass)
200216
.chain(session -> session
201217
.createSelectionQuery("FROM " + PanacheJpaUtil.getEntityName(entityClass), entityClass)
202218
.getResultCount());
@@ -206,13 +222,13 @@ public Uni<Long> count(Class<?> entityClass) {
206222
public Uni<Long> count(Class<?> entityClass, String panacheQuery, Object... params) {
207223

208224
if (PanacheJpaUtil.isNamedQuery(panacheQuery))
209-
return (Uni) getSession().chain(session -> {
225+
return (Uni) getSession(entityClass).chain(session -> {
210226
String namedQueryName = panacheQuery.substring(1);
211227
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
212228
return bindParameters(session.createNamedQuery(namedQueryName, Long.class), params).getSingleResult();
213229
});
214230

215-
return getSession().chain(session -> bindParameters(
231+
return getSession(entityClass).chain(session -> bindParameters(
216232
session.createSelectionQuery(PanacheJpaUtil.createQueryForCount(entityClass, panacheQuery, paramCount(params)),
217233
Object.class),
218234
params).getResultCount())
@@ -223,13 +239,13 @@ public Uni<Long> count(Class<?> entityClass, String panacheQuery, Object... para
223239
public Uni<Long> count(Class<?> entityClass, String panacheQuery, Map<String, Object> params) {
224240

225241
if (PanacheJpaUtil.isNamedQuery(panacheQuery))
226-
return getSession().chain(session -> {
242+
return getSession(entityClass).chain(session -> {
227243
String namedQueryName = panacheQuery.substring(1);
228244
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
229245
return bindParameters(session.createNamedQuery(namedQueryName, Long.class), params).getSingleResult();
230246
});
231247

232-
return getSession().chain(session -> bindParameters(
248+
return getSession(entityClass).chain(session -> bindParameters(
233249
session.createSelectionQuery(PanacheJpaUtil.createQueryForCount(entityClass, panacheQuery, paramCount(params)),
234250
Object.class),
235251
params).getResultCount())
@@ -258,7 +274,7 @@ public Uni<Boolean> exists(Class<?> entityClass, String query, Parameters params
258274
}
259275

260276
public Uni<Long> deleteAll(Class<?> entityClass) {
261-
return getSession().chain(
277+
return getSession(entityClass).chain(
262278
session -> session.createMutationQuery("DELETE FROM " + PanacheJpaUtil.getEntityName(entityClass))
263279
.executeUpdate()
264280
.map(Integer::longValue));
@@ -272,20 +288,20 @@ public Uni<Boolean> deleteById(Class<?> entityClass, Object id) {
272288
if (entity == null) {
273289
return Uni.createFrom().item(false);
274290
}
275-
return getSession().chain(session -> session.remove(entity).map(v -> true));
291+
return getSession(entityClass).chain(session -> session.remove(entity).map(v -> true));
276292
});
277293
}
278294

279295
public Uni<Long> delete(Class<?> entityClass, String panacheQuery, Object... params) {
280296

281297
if (PanacheJpaUtil.isNamedQuery(panacheQuery))
282-
return getSession().chain(session -> {
298+
return getSession(entityClass).chain(session -> {
283299
String namedQueryName = panacheQuery.substring(1);
284300
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
285301
return bindParameters(session.createNamedQuery(namedQueryName), params).executeUpdate().map(Integer::longValue);
286302
});
287303

288-
return getSession().chain(session -> bindParameters(
304+
return getSession(entityClass).chain(session -> bindParameters(
289305
session.createMutationQuery(PanacheJpaUtil.createDeleteQuery(entityClass, panacheQuery, paramCount(params))),
290306
params)
291307
.executeUpdate().map(Integer::longValue))
@@ -296,13 +312,13 @@ public Uni<Long> delete(Class<?> entityClass, String panacheQuery, Object... par
296312
public Uni<Long> delete(Class<?> entityClass, String panacheQuery, Map<String, Object> params) {
297313

298314
if (PanacheJpaUtil.isNamedQuery(panacheQuery))
299-
return getSession().chain(session -> {
315+
return getSession(entityClass).chain(session -> {
300316
String namedQueryName = panacheQuery.substring(1);
301317
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
302318
return bindParameters(session.createNamedQuery(namedQueryName), params).executeUpdate().map(Integer::longValue);
303319
});
304320

305-
return getSession().chain(session -> bindParameters(
321+
return getSession(entityClass).chain(session -> bindParameters(
306322
session.createMutationQuery(PanacheJpaUtil.createDeleteQuery(entityClass, panacheQuery, paramCount(params))),
307323
params)
308324
.executeUpdate().map(Integer::longValue))
@@ -322,7 +338,7 @@ public IllegalStateException implementationInjectionMissing() {
322338
public Uni<Integer> executeUpdate(Class<?> entityClass, String panacheQuery, Object... params) {
323339

324340
if (PanacheJpaUtil.isNamedQuery(panacheQuery))
325-
return (Uni) getSession().chain(session -> {
341+
return (Uni) getSession(entityClass).chain(session -> {
326342
String namedQueryName = panacheQuery.substring(1);
327343
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
328344
return bindParameters(session.createNamedQuery(namedQueryName), params).executeUpdate();
@@ -337,7 +353,7 @@ public Uni<Integer> executeUpdate(Class<?> entityClass, String panacheQuery, Obj
337353
public Uni<Integer> executeUpdate(Class<?> entityClass, String panacheQuery, Map<String, Object> params) {
338354

339355
if (PanacheJpaUtil.isNamedQuery(panacheQuery))
340-
return (Uni) getSession().chain(session -> {
356+
return (Uni) getSession(entityClass).chain(session -> {
341357
String namedQueryName = panacheQuery.substring(1);
342358
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
343359
return bindParameters(session.createNamedQuery(namedQueryName), params).executeUpdate();
@@ -364,8 +380,19 @@ public Uni<Integer> update(Class<?> entityClass, String query, Object... params)
364380
//
365381
// Static helpers
366382

383+
// TODO Luca This returns only the default session
367384
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);
369396
}
370397

371398
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
396423
}
397424

398425
public static Uni<Integer> executeUpdate(String query, Object... params) {
426+
// TODO Luca not sure about this
399427
return getSession().chain(session -> bindParameters(session.createMutationQuery(query), params)
400428
.executeUpdate());
401429
}
402430

431+
// TODO Luca not sure about this
403432
public static Uni<Integer> executeUpdate(String query, Map<String, Object> params) {
404433
return getSession().chain(session -> bindParameters(session.createMutationQuery(query), params)
405434
.executeUpdate());

0 commit comments

Comments
 (0)