Skip to content

Commit

Permalink
Merge pull request quarkusio#41518 from yrodiere/panache-session
Browse files Browse the repository at this point in the history
Use Session instead of EntityManager in Panache internals
  • Loading branch information
gsmet authored Jun 27, 2024
2 parents 7bb6f10 + 6f859d4 commit c43d47e
Show file tree
Hide file tree
Showing 24 changed files with 246 additions and 143 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public static void setEntityToPersistenceUnit(Map<String, String> map) {
entityToPersistenceUnit = Collections.unmodifiableMap(map);
}

protected abstract PanacheQueryType createPanacheQuery(EntityManager em, String query, String originalQuery, String orderBy,
protected abstract PanacheQueryType createPanacheQuery(Session session, String query, String originalQuery, String orderBy,
Object paramsArrayOrMap);

public abstract List<?> list(PanacheQueryType query);
Expand All @@ -48,17 +48,26 @@ protected abstract PanacheQueryType createPanacheQuery(EntityManager em, String
* @return {@link EntityManager}
*/
public EntityManager getEntityManager(Class<?> clazz) {
return getSession(clazz);
}

/**
* Returns the {@link Session} for the given {@link Class<?> entity}
*
* @return {@link Session}
*/
public Session getSession(Class<?> clazz) {
String clazzName = clazz.getName();
String persistentUnitName = entityToPersistenceUnit.get(clazzName);
return getEntityManager(persistentUnitName);
return getSession(persistentUnitName);
}

public EntityManager getEntityManager(String persistentUnitName) {
public Session getSession(String persistentUnitName) {
ArcContainer arcContainer = Arc.container();
if (persistentUnitName == null || PersistenceUnitUtil.isDefaultPersistenceUnit(persistentUnitName)) {
InstanceHandle<EntityManager> emHandle = arcContainer.instance(EntityManager.class);
if (emHandle.isAvailable()) {
return emHandle.get();
InstanceHandle<Session> sessionHandle = arcContainer.instance(Session.class);
if (sessionHandle.isAvailable()) {
return sessionHandle.get();
}
if (!arcContainer.instance(AgroalDataSource.class).isAvailable()) {
throw new IllegalStateException(
Expand All @@ -68,10 +77,10 @@ public EntityManager getEntityManager(String persistentUnitName) {
"No entities were found. Did you forget to annotate your Panache Entity classes with '@Entity'?");
}

InstanceHandle<EntityManager> emHandle = arcContainer.instance(EntityManager.class,
InstanceHandle<Session> sessionHandle = arcContainer.instance(Session.class,
new PersistenceUnit.PersistenceUnitLiteral(persistentUnitName));
if (emHandle.isAvailable()) {
return emHandle.get();
if (sessionHandle.isAvailable()) {
return sessionHandle.get();
}
if (!arcContainer.instance(AgroalDataSource.class,
new DataSource.DataSourceLiteral(persistentUnitName)).isAvailable()) {
Expand All @@ -85,26 +94,26 @@ public EntityManager getEntityManager(String persistentUnitName) {
+ persistentUnitName + "\".packages' property?");
}

public EntityManager getEntityManager() {
return getEntityManager(DEFAULT_PERSISTENCE_UNIT_NAME);
public Session getSession() {
return getSession(DEFAULT_PERSISTENCE_UNIT_NAME);
}
//
// Instance methods

public void persist(Object entity) {
EntityManager em = getEntityManager(entity.getClass());
persist(em, entity);
Session session = getSession(entity.getClass());
persist(session, entity);
}

public void persist(EntityManager em, Object entity) {
if (!em.contains(entity)) {
em.persist(entity);
public void persist(Session session, Object entity) {
if (!session.contains(entity)) {
session.persist(entity);
}
}

public void persist(Iterable<?> entities) {
for (Object entity : entities) {
persist(getEntityManager(entity.getClass()), entity);
persist(getSession(entity.getClass()), entity);
}
}

Expand All @@ -120,24 +129,24 @@ public void persist(Stream<?> entities) {
}

public void delete(Object entity) {
EntityManager em = getEntityManager(entity.getClass());
em.remove(em.contains(entity) ? entity : em.unwrap(Session.class).getReference(entity));
Session session = getSession(entity.getClass());
session.remove(session.contains(entity) ? entity : session.getReference(entity));
}

public boolean isPersistent(Object entity) {
return getEntityManager(entity.getClass()).contains(entity);
return getSession(entity.getClass()).contains(entity);
}

public void flush() {
getEntityManager().flush();
getSession().flush();
}

public void flush(Object entity) {
getEntityManager(entity.getClass()).flush();
getSession(entity.getClass()).flush();
}

public void flush(Class<?> clazz) {
getEntityManager(clazz).flush();
getSession(clazz).flush();
}
//
// Private stuff
Expand Down Expand Up @@ -176,11 +185,11 @@ public int paramCount(Map<String, Object> params) {
// Queries

public Object findById(Class<?> entityClass, Object id) {
return getEntityManager(entityClass).find(entityClass, id);
return getSession(entityClass).find(entityClass, id);
}

public Object findById(Class<?> entityClass, Object id, LockModeType lockModeType) {
return getEntityManager(entityClass).find(entityClass, id, lockModeType);
return getSession(entityClass).find(entityClass, id, lockModeType);
}

public Optional<?> findByIdOptional(Class<?> entityClass, Object id) {
Expand All @@ -196,7 +205,7 @@ public PanacheQueryType find(Class<?> entityClass, String query, Object... param
}

public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Sort sort, Object... params) {
EntityManager em = getEntityManager(entityClass);
Session session = getSession(entityClass);
if (PanacheJpaUtil.isNamedQuery(panacheQuery)) {
String namedQuery = panacheQuery.substring(1);
if (sort != null) {
Expand All @@ -205,19 +214,19 @@ public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Sort sor
+ "\" instead");
}
NamedQueryUtil.checkNamedQuery(entityClass, namedQuery);
return createPanacheQuery(em, panacheQuery, panacheQuery, null, params);
return createPanacheQuery(session, panacheQuery, panacheQuery, null, params);
}

String translatedHqlQuery = PanacheJpaUtil.createFindQuery(entityClass, panacheQuery, paramCount(params));
return createPanacheQuery(em, translatedHqlQuery, panacheQuery, PanacheJpaUtil.toOrderBy(sort), params);
return createPanacheQuery(session, translatedHqlQuery, panacheQuery, PanacheJpaUtil.toOrderBy(sort), params);
}

public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Map<String, Object> params) {
return find(entityClass, panacheQuery, null, params);
}

public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Sort sort, Map<String, Object> params) {
EntityManager em = getEntityManager(entityClass);
Session session = getSession(entityClass);
if (PanacheJpaUtil.isNamedQuery(panacheQuery)) {
String namedQuery = panacheQuery.substring(1);
if (sort != null) {
Expand All @@ -226,11 +235,11 @@ public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Sort sor
+ "\" instead");
}
NamedQueryUtil.checkNamedQuery(entityClass, namedQuery);
return createPanacheQuery(em, panacheQuery, panacheQuery, null, params);
return createPanacheQuery(session, panacheQuery, panacheQuery, null, params);
}

String translatedHqlQuery = PanacheJpaUtil.createFindQuery(entityClass, panacheQuery, paramCount(params));
return createPanacheQuery(em, translatedHqlQuery, panacheQuery, PanacheJpaUtil.toOrderBy(sort), params);
return createPanacheQuery(session, translatedHqlQuery, panacheQuery, PanacheJpaUtil.toOrderBy(sort), params);
}

public PanacheQueryType find(Class<?> entityClass, String panacheQuery, Parameters params) {
Expand Down Expand Up @@ -291,14 +300,14 @@ public Stream<?> stream(Class<?> entityClass, String panacheQuery, Sort sort, Pa

public PanacheQueryType findAll(Class<?> entityClass) {
String query = "FROM " + PanacheJpaUtil.getEntityName(entityClass);
EntityManager em = getEntityManager(entityClass);
return createPanacheQuery(em, query, null, null, null);
Session session = getSession(entityClass);
return createPanacheQuery(session, query, null, null, null);
}

public PanacheQueryType findAll(Class<?> entityClass, Sort sort) {
String query = "FROM " + PanacheJpaUtil.getEntityName(entityClass);
EntityManager em = getEntityManager(entityClass);
return createPanacheQuery(em, query, null, PanacheJpaUtil.toOrderBy(sort), null);
Session session = getSession(entityClass);
return createPanacheQuery(session, query, null, PanacheJpaUtil.toOrderBy(sort), null);
}

public List<?> listAll(Class<?> entityClass) {
Expand All @@ -318,7 +327,7 @@ public Stream<?> streamAll(Class<?> entityClass, Sort sort) {
}

public long count(Class<?> entityClass) {
return (long) getEntityManager(entityClass)
return (long) getSession(entityClass)
.createQuery("SELECT COUNT(*) FROM " + PanacheJpaUtil.getEntityName(entityClass))
.getSingleResult();
}
Expand All @@ -331,7 +340,7 @@ public long count(Class<?> entityClass, String panacheQuery, Object... params) {

try {
return (long) bindParameters(
getEntityManager(entityClass)
getSession(entityClass)
.createQuery(PanacheJpaUtil.createCountQuery(entityClass, panacheQuery, paramCount(params))),
params).getSingleResult();
} catch (IllegalArgumentException x) {
Expand All @@ -347,7 +356,7 @@ public long count(Class<?> entityClass, String panacheQuery, Map<String, Object>

try {
return (long) bindParameters(
getEntityManager(entityClass)
getSession(entityClass)
.createQuery(PanacheJpaUtil.createCountQuery(entityClass, panacheQuery, paramCount(params))),
params).getSingleResult();
} catch (IllegalArgumentException x) {
Expand All @@ -366,7 +375,7 @@ private Query extractNamedQuery(Class<?> entityClass, String query) {

String namedQueryName = query.substring(1);
NamedQueryUtil.checkNamedQuery(entityClass, namedQueryName);
return getEntityManager(entityClass).createNamedQuery(namedQueryName);
return getSession(entityClass).createNamedQuery(namedQueryName);
}

public boolean exists(Class<?> entityClass) {
Expand All @@ -386,7 +395,7 @@ public boolean exists(Class<?> entityClass, String query, Parameters params) {
}

public long deleteAll(Class<?> entityClass) {
return getEntityManager(entityClass).createQuery("DELETE FROM " + PanacheJpaUtil.getEntityName(entityClass))
return getSession(entityClass).createQuery("DELETE FROM " + PanacheJpaUtil.getEntityName(entityClass))
.executeUpdate();
}

Expand All @@ -397,7 +406,7 @@ public boolean deleteById(Class<?> entityClass, Object id) {
if (entity == null) {
return false;
}
getEntityManager(entityClass).remove(entity);
getSession(entityClass).remove(entity);
return true;
}

Expand All @@ -409,7 +418,7 @@ public long delete(Class<?> entityClass, String panacheQuery, Object... params)

try {
return bindParameters(
getEntityManager(entityClass)
getSession(entityClass)
.createQuery(PanacheJpaUtil.createDeleteQuery(entityClass, panacheQuery, paramCount(params))),
params)
.executeUpdate();
Expand All @@ -426,7 +435,7 @@ public long delete(Class<?> entityClass, String panacheQuery, Map<String, Object

try {
return bindParameters(
getEntityManager(entityClass)
getSession(entityClass)
.createQuery(PanacheJpaUtil.createDeleteQuery(entityClass, panacheQuery, paramCount(params))),
params)
.executeUpdate();
Expand All @@ -448,7 +457,7 @@ public static IllegalStateException implementationInjectionMissing() {
* Execute update on default persistence unit
*/
public int executeUpdate(String query, Object... params) {
Query jpaQuery = getEntityManager(DEFAULT_PERSISTENCE_UNIT_NAME).createQuery(query);
Query jpaQuery = getSession(DEFAULT_PERSISTENCE_UNIT_NAME).createQuery(query);
bindParameters(jpaQuery, params);
return jpaQuery.executeUpdate();
}
Expand All @@ -457,7 +466,7 @@ public int executeUpdate(String query, Object... params) {
* Execute update on default persistence unit
*/
public int executeUpdate(String query, Map<String, Object> params) {
Query jpaQuery = getEntityManager(DEFAULT_PERSISTENCE_UNIT_NAME).createQuery(query);
Query jpaQuery = getSession(DEFAULT_PERSISTENCE_UNIT_NAME).createQuery(query);
bindParameters(jpaQuery, params);
return jpaQuery.executeUpdate();
}
Expand All @@ -470,7 +479,7 @@ public int executeUpdate(Class<?> entityClass, String panacheQuery, Object... pa

try {
String updateQuery = PanacheJpaUtil.createUpdateQuery(entityClass, panacheQuery, paramCount(params));
Query jpaQuery = getEntityManager(entityClass).createQuery(updateQuery);
Query jpaQuery = getSession(entityClass).createQuery(updateQuery);
bindParameters(jpaQuery, params);
return jpaQuery.executeUpdate();
} catch (IllegalArgumentException x) {
Expand All @@ -486,7 +495,7 @@ public int executeUpdate(Class<?> entityClass, String panacheQuery, Map<String,

try {
String updateQuery = PanacheJpaUtil.createUpdateQuery(entityClass, panacheQuery, paramCount(params));
Query jpaQuery = getEntityManager(entityClass).createQuery(updateQuery);
Query jpaQuery = getSession(entityClass).createQuery(updateQuery);
bindParameters(jpaQuery, params);
return jpaQuery.executeUpdate();
} catch (IllegalArgumentException x) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import jakarta.persistence.EntityManager;
import jakarta.persistence.LockModeType;
import jakarta.persistence.NonUniqueResultException;
import jakarta.persistence.Query;

import org.hibernate.Filter;
import org.hibernate.Session;
import org.hibernate.query.Query;

import io.quarkus.hibernate.orm.panache.common.NestedProjectedClass;
import io.quarkus.hibernate.orm.panache.common.ProjectedFieldName;
Expand Down Expand Up @@ -48,7 +47,7 @@ public void close() {
private String originalQuery;
protected String countQuery;
private String orderBy;
private EntityManager em;
private Session session;

private Page page;
private Long count;
Expand All @@ -61,9 +60,9 @@ public void close() {
private Map<String, Map<String, Object>> filters;
private Class<?> projectionType;

public CommonPanacheQueryImpl(EntityManager em, String query, String originalQuery, String orderBy,
public CommonPanacheQueryImpl(Session session, String query, String originalQuery, String orderBy,
Object paramsArrayOrMap) {
this.em = em;
this.session = session;
this.query = query;
this.originalQuery = originalQuery;
this.orderBy = orderBy;
Expand All @@ -72,7 +71,7 @@ public CommonPanacheQueryImpl(EntityManager em, String query, String originalQue

private CommonPanacheQueryImpl(CommonPanacheQueryImpl<?> previousQuery, String newQueryString, String countQuery,
Class<?> projectionType) {
this.em = previousQuery.em;
this.session = previousQuery.session;
this.query = newQueryString;
this.countQuery = countQuery;
this.orderBy = previousQuery.orderBy;
Expand All @@ -91,7 +90,7 @@ private CommonPanacheQueryImpl(CommonPanacheQueryImpl<?> previousQuery, String n
public <T> CommonPanacheQueryImpl<T> project(Class<T> type) {
String selectQuery = query;
if (PanacheJpaUtil.isNamedQuery(query)) {
org.hibernate.query.Query q = (org.hibernate.query.Query) em.createNamedQuery(query.substring(1));
Query q = session.createNamedQuery(query.substring(1));
selectQuery = q.getQueryString();
}

Expand Down Expand Up @@ -269,11 +268,11 @@ public long count() {
if (count == null) {
String selectQuery = query;
if (PanacheJpaUtil.isNamedQuery(query)) {
org.hibernate.query.Query q = (org.hibernate.query.Query) em.createNamedQuery(query.substring(1));
Query q = session.createNamedQuery(query.substring(1));
selectQuery = q.getQueryString();
}

Query countQuery = em.createQuery(countQuery(selectQuery));
Query countQuery = session.createQuery(countQuery(selectQuery));
if (paramsArrayOrMap instanceof Map)
AbstractJpaOperations.bindParameters(countQuery, (Map<String, Object>) paramsArrayOrMap);
else
Expand Down Expand Up @@ -380,10 +379,10 @@ private Query createBaseQuery() {
Query jpaQuery;
if (PanacheJpaUtil.isNamedQuery(query)) {
String namedQuery = query.substring(1);
jpaQuery = em.createNamedQuery(namedQuery, projectionType);
jpaQuery = session.createNamedQuery(namedQuery, projectionType);
} else {
try {
jpaQuery = em.createQuery(orderBy != null ? query + orderBy : query, projectionType);
jpaQuery = session.createQuery(orderBy != null ? query + orderBy : query, projectionType);
} catch (IllegalArgumentException x) {
throw NamedQueryUtil.checkForNamedQueryMistake(x, originalQuery);
}
Expand All @@ -410,7 +409,6 @@ private Query createBaseQuery() {
private NonThrowingCloseable applyFilters() {
if (filters == null)
return NO_FILTERS;
Session session = em.unwrap(Session.class);
for (Entry<String, Map<String, Object>> entry : filters.entrySet()) {
Filter filter = session.enableFilter(entry.getKey());
for (Entry<String, Object> paramEntry : entry.getValue().entrySet()) {
Expand Down
Loading

0 comments on commit c43d47e

Please sign in to comment.