From 6f859d4accc336690f7a3653723c8cfec407aed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 27 Jun 2024 16:12:42 +0200 Subject: [PATCH] Use Session instead of EntityManager in Panache internals --- .../common/runtime/AbstractJpaOperations.java | 103 ++++++++++-------- .../runtime/CommonPanacheQueryImpl.java | 22 ++-- .../KotlinPanacheResourceProcessor.java | 4 +- .../orm/panache/kotlin/PanacheCompanion.kt | 8 ++ .../panache/kotlin/PanacheRepositoryBase.kt | 13 ++- .../kotlin/runtime/KotlinJpaOperations.kt | 6 +- .../kotlin/runtime/PanacheQueryImpl.kt | 7 +- .../PanacheHibernateResourceProcessor.java | 6 +- .../deployment/test/EntityManagerTest.java | 5 + .../DefaultPersistenceUnitConfigTest.java | 7 ++ .../DefaultPersistenceUnitFileTest.java | 7 ++ .../MultiplePersistenceUnitConfigTest.java | 15 +++ .../hibernate/orm/panache/Panache.java | 43 +++++++- .../orm/panache/PanacheEntityBase.java | 12 ++ .../orm/panache/PanacheRepositoryBase.java | 14 ++- .../runtime/AdditionalJpaOperations.java | 32 +++--- .../runtime/CustomCountPanacheQuery.java | 6 +- .../orm/panache/runtime/JpaOperations.java | 6 +- .../orm/panache/runtime/PanacheQueryImpl.java | 7 +- .../EntityDataAccessImplementor.java | 8 +- .../RepositoryDataAccessImplementor.java | 12 +- .../generate/StockMethodsAdder.java | 10 +- .../data/runtime/RepositorySupport.java | 10 +- .../io/quarkus/it/panache/TestEndpoint.java | 1 + 24 files changed, 237 insertions(+), 127 deletions(-) diff --git a/extensions/panache/hibernate-orm-panache-common/runtime/src/main/java/io/quarkus/hibernate/orm/panache/common/runtime/AbstractJpaOperations.java b/extensions/panache/hibernate-orm-panache-common/runtime/src/main/java/io/quarkus/hibernate/orm/panache/common/runtime/AbstractJpaOperations.java index ebcb984482cf5..84042517ac25a 100644 --- a/extensions/panache/hibernate-orm-panache-common/runtime/src/main/java/io/quarkus/hibernate/orm/panache/common/runtime/AbstractJpaOperations.java +++ b/extensions/panache/hibernate-orm-panache-common/runtime/src/main/java/io/quarkus/hibernate/orm/panache/common/runtime/AbstractJpaOperations.java @@ -35,7 +35,7 @@ public static void setEntityToPersistenceUnit(Map 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); @@ -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 emHandle = arcContainer.instance(EntityManager.class); - if (emHandle.isAvailable()) { - return emHandle.get(); + InstanceHandle sessionHandle = arcContainer.instance(Session.class); + if (sessionHandle.isAvailable()) { + return sessionHandle.get(); } if (!arcContainer.instance(AgroalDataSource.class).isAvailable()) { throw new IllegalStateException( @@ -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 emHandle = arcContainer.instance(EntityManager.class, + InstanceHandle 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()) { @@ -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); } } @@ -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 @@ -176,11 +185,11 @@ public int paramCount(Map 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) { @@ -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) { @@ -205,11 +214,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, Map params) { @@ -217,7 +226,7 @@ public PanacheQueryType find(Class entityClass, String panacheQuery, Map entityClass, String panacheQuery, Sort sort, Map params) { - EntityManager em = getEntityManager(entityClass); + Session session = getSession(entityClass); if (PanacheJpaUtil.isNamedQuery(panacheQuery)) { String namedQuery = panacheQuery.substring(1); if (sort != null) { @@ -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) { @@ -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) { @@ -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(); } @@ -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) { @@ -347,7 +356,7 @@ public long count(Class entityClass, String panacheQuery, Map try { return (long) bindParameters( - getEntityManager(entityClass) + getSession(entityClass) .createQuery(PanacheJpaUtil.createCountQuery(entityClass, panacheQuery, paramCount(params))), params).getSingleResult(); } catch (IllegalArgumentException x) { @@ -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) { @@ -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(); } @@ -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; } @@ -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(); @@ -426,7 +435,7 @@ public long delete(Class entityClass, String panacheQuery, Map 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(); } @@ -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) { @@ -486,7 +495,7 @@ public int executeUpdate(Class entityClass, String panacheQuery, Map> 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; @@ -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; @@ -91,7 +90,7 @@ private CommonPanacheQueryImpl(CommonPanacheQueryImpl previousQuery, String n public CommonPanacheQueryImpl project(Class 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(); } @@ -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) paramsArrayOrMap); else @@ -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); } @@ -410,7 +409,6 @@ private Query createBaseQuery() { private NonThrowingCloseable applyFilters() { if (filters == null) return NO_FILTERS; - Session session = em.unwrap(Session.class); for (Entry> entry : filters.entrySet()) { Filter filter = session.enableFilter(entry.getKey()); for (Entry paramEntry : entry.getValue().entrySet()) { diff --git a/extensions/panache/hibernate-orm-panache-kotlin/deployment/src/main/java/io/quarkus/hibernate/orm/panache/kotlin/deployment/KotlinPanacheResourceProcessor.java b/extensions/panache/hibernate-orm-panache-kotlin/deployment/src/main/java/io/quarkus/hibernate/orm/panache/kotlin/deployment/KotlinPanacheResourceProcessor.java index 21ea19449a7c4..64874af524d68 100644 --- a/extensions/panache/hibernate-orm-panache-kotlin/deployment/src/main/java/io/quarkus/hibernate/orm/panache/kotlin/deployment/KotlinPanacheResourceProcessor.java +++ b/extensions/panache/hibernate-orm-panache-kotlin/deployment/src/main/java/io/quarkus/hibernate/orm/panache/kotlin/deployment/KotlinPanacheResourceProcessor.java @@ -15,9 +15,9 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import jakarta.persistence.EntityManager; import jakarta.persistence.Id; +import org.hibernate.Session; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.DotName; @@ -56,7 +56,7 @@ public final class KotlinPanacheResourceProcessor { private static final DotName DOTNAME_ID = DotName.createSimple(Id.class.getName()); private static final DotName DOTNAME_PANACHE_ENTITY = DotName.createSimple(PanacheEntity.class.getName()); - private static final Set UNREMOVABLE_BEANS = singleton(createSimple(EntityManager.class.getName())); + private static final Set UNREMOVABLE_BEANS = singleton(createSimple(Session.class.getName())); @BuildStep @Record(ExecutionTime.STATIC_INIT) diff --git a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheCompanion.kt b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheCompanion.kt index 376d26b2b3eb1..c90eb4fc4c0fa 100644 --- a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheCompanion.kt +++ b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheCompanion.kt @@ -8,6 +8,7 @@ import io.quarkus.panache.common.impl.GenerateBridge import jakarta.persistence.EntityManager import jakarta.persistence.LockModeType import java.util.stream.Stream +import org.hibernate.Session /** * Defines methods to be used via the companion objects of entities. @@ -30,6 +31,13 @@ interface PanacheCompanionBase { */ @GenerateBridge fun getEntityManager(): EntityManager = throw implementationInjectionMissing() + /** + * Returns the [Session] for the [Entity] for extra operations (eg. CriteriaQueries) + * + * @return the [Session] for the [Entity] + */ + @GenerateBridge fun getSession(): Session = throw implementationInjectionMissing() + /** * Find an entity of this type by ID. * diff --git a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheRepositoryBase.kt b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheRepositoryBase.kt index bc8869aa79027..689a9169f20bf 100644 --- a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheRepositoryBase.kt +++ b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/PanacheRepositoryBase.kt @@ -8,6 +8,7 @@ import io.quarkus.panache.common.impl.GenerateBridge import jakarta.persistence.EntityManager import jakarta.persistence.LockModeType import java.util.stream.Stream +import org.hibernate.Session /** * Represents a Repository for a specific type of entity `Entity`, with an ID type of `Id`. @@ -26,6 +27,13 @@ interface PanacheRepositoryBase { */ @GenerateBridge fun getEntityManager(): EntityManager = throw implementationInjectionMissing() + /** + * Returns the [Session] for the [Entity] for extra operations (eg. CriteriaQueries) + * + * @return the [Session] for the [Entity] + */ + @GenerateBridge fun getSession(): Session = throw implementationInjectionMissing() + /** * Persist the given entity in the database, if not already persisted. * @@ -71,11 +79,10 @@ interface PanacheRepositoryBase { fun isPersistent(entity: Entity): Boolean = INSTANCE.isPersistent(entity) /** - * Flushes all pending changes to the database using the EntityManager for the [Entity] entity - * class. + * Flushes all pending changes to the database using the Session for the [Entity] entity class. */ fun flush() { - getEntityManager().flush() + getSession().flush() } /** diff --git a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/KotlinJpaOperations.kt b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/KotlinJpaOperations.kt index a8348890cee26..5013b8d0cb92d 100644 --- a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/KotlinJpaOperations.kt +++ b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/KotlinJpaOperations.kt @@ -1,16 +1,16 @@ package io.quarkus.hibernate.orm.panache.kotlin.runtime import io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations -import jakarta.persistence.EntityManager +import org.hibernate.Session class KotlinJpaOperations : AbstractJpaOperations>() { override fun createPanacheQuery( - em: EntityManager, + session: Session, hqlQuery: String, originalQuery: String?, orderBy: String?, paramsArrayOrMap: Any? - ) = PanacheQueryImpl(em, hqlQuery, originalQuery, orderBy, paramsArrayOrMap) + ) = PanacheQueryImpl(session, hqlQuery, originalQuery, orderBy, paramsArrayOrMap) override fun list(query: PanacheQueryImpl<*>) = query.list() diff --git a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/PanacheQueryImpl.kt b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/PanacheQueryImpl.kt index e63ea6b628290..eacd8af1eafdc 100644 --- a/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/PanacheQueryImpl.kt +++ b/extensions/panache/hibernate-orm-panache-kotlin/runtime/src/main/kotlin/io/quarkus/hibernate/orm/panache/kotlin/runtime/PanacheQueryImpl.kt @@ -4,21 +4,22 @@ import io.quarkus.hibernate.orm.panache.common.runtime.CommonPanacheQueryImpl import io.quarkus.hibernate.orm.panache.kotlin.PanacheQuery import io.quarkus.panache.common.Page import io.quarkus.panache.common.Parameters -import jakarta.persistence.EntityManager import jakarta.persistence.LockModeType import java.util.stream.Stream +import org.hibernate.Session class PanacheQueryImpl : PanacheQuery { private var delegate: CommonPanacheQueryImpl internal constructor( - em: EntityManager?, + session: Session?, hqlQuery: String?, originalQuery: String?, orderBy: String?, paramsArrayOrMap: Any? ) { - delegate = CommonPanacheQueryImpl(em, hqlQuery, originalQuery, orderBy, paramsArrayOrMap) + delegate = + CommonPanacheQueryImpl(session, hqlQuery, originalQuery, orderBy, paramsArrayOrMap) } private constructor(delegate: CommonPanacheQueryImpl) { diff --git a/extensions/panache/hibernate-orm-panache/deployment/src/main/java/io/quarkus/hibernate/orm/panache/deployment/PanacheHibernateResourceProcessor.java b/extensions/panache/hibernate-orm-panache/deployment/src/main/java/io/quarkus/hibernate/orm/panache/deployment/PanacheHibernateResourceProcessor.java index a77e10b89193a..c4c8f881c429e 100644 --- a/extensions/panache/hibernate-orm-panache/deployment/src/main/java/io/quarkus/hibernate/orm/panache/deployment/PanacheHibernateResourceProcessor.java +++ b/extensions/panache/hibernate-orm-panache/deployment/src/main/java/io/quarkus/hibernate/orm/panache/deployment/PanacheHibernateResourceProcessor.java @@ -11,9 +11,9 @@ import java.util.Set; import java.util.stream.Collectors; -import jakarta.persistence.EntityManager; import jakarta.persistence.Id; +import org.hibernate.Session; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.DotName; @@ -52,7 +52,7 @@ public final class PanacheHibernateResourceProcessor { static final DotName DOTNAME_PANACHE_ENTITY = DotName.createSimple(PanacheEntity.class.getName()); static final DotName DOTNAME_PANACHE_ENTITY_BASE = DotName.createSimple(PanacheEntityBase.class.getName()); - private static final DotName DOTNAME_ENTITY_MANAGER = DotName.createSimple(EntityManager.class.getName()); + private static final DotName DOTNAME_SESSION = DotName.createSimple(Session.class.getName()); private static final DotName DOTNAME_ID = DotName.createSimple(Id.class.getName()); @@ -70,7 +70,7 @@ AdditionalJpaModelBuildItem produceModel() { @BuildStep UnremovableBeanBuildItem ensureBeanLookupAvailable() { - return new UnremovableBeanBuildItem(new UnremovableBeanBuildItem.BeanTypeExclusion(DOTNAME_ENTITY_MANAGER)); + return new UnremovableBeanBuildItem(new UnremovableBeanBuildItem.BeanTypeExclusion(DOTNAME_SESSION)); } @BuildStep diff --git a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/EntityManagerTest.java b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/EntityManagerTest.java index c8fffcb682aec..a90d9f5dfaa87 100644 --- a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/EntityManagerTest.java +++ b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/EntityManagerTest.java @@ -20,4 +20,9 @@ void entityManagerShouldExist() { assertNotNull(MyEntity.getEntityManager()); } + @Test + void sessionShouldExist() { + assertNotNull(MyEntity.getSession()); + } + } diff --git a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitConfigTest.java b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitConfigTest.java index 570e34ee26501..1c32770ef24f3 100644 --- a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitConfigTest.java +++ b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitConfigTest.java @@ -40,4 +40,11 @@ void entityManagerShouldExist() { assertNotNull(SecondEntity.getEntityManager()); } + + @Test + void sessionShouldExist() { + assertNotNull(FirstEntity.getSession()); + + assertNotNull(SecondEntity.getSession()); + } } diff --git a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitFileTest.java b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitFileTest.java index ad27967a6292f..f2b7707048699 100644 --- a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitFileTest.java +++ b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/DefaultPersistenceUnitFileTest.java @@ -45,4 +45,11 @@ void entityManagerShouldExist() { assertNotNull(SecondEntity.getEntityManager()); } + + @Test + void sessionShouldExist() { + assertNotNull(FirstEntity.getSession()); + + assertNotNull(SecondEntity.getSession()); + } } diff --git a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/MultiplePersistenceUnitConfigTest.java b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/MultiplePersistenceUnitConfigTest.java index de9af844472dd..bdbf45b773e66 100644 --- a/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/MultiplePersistenceUnitConfigTest.java +++ b/extensions/panache/hibernate-orm-panache/deployment/src/test/java/io/quarkus/hibernate/orm/panache/deployment/test/multiple_pu/MultiplePersistenceUnitConfigTest.java @@ -7,6 +7,7 @@ import jakarta.persistence.EntityManager; import org.hamcrest.Matchers; +import org.hibernate.Session; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -26,10 +27,15 @@ public class MultiplePersistenceUnitConfigTest { @Inject EntityManager defaultEntityManager; + @Inject + Session defaulSession; @Inject @PersistenceUnit("second") EntityManager secondEntityManager; + @Inject + @PersistenceUnit("second") + Session secondSession; @Test public void panacheOperations() { @@ -54,4 +60,13 @@ void entityManagerShouldExist() { assertNotNull(SecondEntity.getEntityManager()); assertEquals(SecondEntity.getEntityManager(), secondEntityManager); } + + @Test + void sessionShouldExist() { + assertNotNull(FirstEntity.getSession()); + assertEquals(FirstEntity.getSession(), defaulSession); + + assertNotNull(SecondEntity.getSession()); + assertEquals(SecondEntity.getSession(), secondSession); + } } diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/Panache.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/Panache.java index 5d93af879699d..18d85adf9eaa3 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/Panache.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/Panache.java @@ -5,6 +5,8 @@ import jakarta.persistence.EntityManager; import jakarta.transaction.TransactionManager; +import org.hibernate.Session; + import io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations; import io.quarkus.hibernate.orm.panache.runtime.JpaOperations; import io.quarkus.panache.common.Parameters; @@ -22,7 +24,16 @@ public class Panache { * @return {@link EntityManager} */ public static EntityManager getEntityManager() { - return JpaOperations.INSTANCE.getEntityManager(); + return JpaOperations.INSTANCE.getSession(); + } + + /** + * Returns the default {@link Session} + * + * @return {@link Session} + */ + public static Session getSession() { + return JpaOperations.INSTANCE.getSession(); } /** @@ -32,7 +43,17 @@ public static EntityManager getEntityManager() { * @return {@link EntityManager} */ public static EntityManager getEntityManager(Class clazz) { - return JpaOperations.INSTANCE.getEntityManager(clazz); + return JpaOperations.INSTANCE.getSession(clazz); + } + + /** + * Returns the {@link Session} for the given {@link Class entity} + * + * @param clazz the entity class corresponding to the session persistence unit. + * @return {@link Session} + */ + public static Session getSession(Class clazz) { + return JpaOperations.INSTANCE.getSession(clazz); } /** @@ -42,7 +63,17 @@ public static EntityManager getEntityManager(Class clazz) { * @return {@link EntityManager} */ public static EntityManager getEntityManager(String persistenceUnit) { - return JpaOperations.INSTANCE.getEntityManager(persistenceUnit); + return JpaOperations.INSTANCE.getSession(persistenceUnit); + } + + /** + * Returns the {@link Session} for the given persistence unit + * + * @param persistenceUnit the persistence unit for this session. + * @return {@link Session} + */ + public static Session getSession(String persistenceUnit) { + return JpaOperations.INSTANCE.getSession(persistenceUnit); } /** @@ -99,7 +130,7 @@ public static void setRollbackOnly() { * Flushes all pending changes to the database using the default entity manager. */ public static void flush() { - getEntityManager().flush(); + getSession().flush(); } /** @@ -108,7 +139,7 @@ public static void flush() { * @param clazz the entity class corresponding to the entity manager persistence unit. */ public static void flush(Class clazz) { - getEntityManager(clazz).flush(); + getSession(clazz).flush(); } /** @@ -117,6 +148,6 @@ public static void flush(Class clazz) { * @param persistenceUnit the persistence unit for this entity manager. */ public static void flush(String persistenceUnit) { - getEntityManager(persistenceUnit).flush(); + getSession(persistenceUnit).flush(); } } diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java index e3d297812f9a2..183fafeff349c 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java @@ -12,6 +12,8 @@ import jakarta.persistence.LockModeType; import jakarta.persistence.Transient; +import org.hibernate.Session; + import com.fasterxml.jackson.annotation.JsonIgnore; import io.quarkus.hibernate.orm.panache.runtime.JpaOperations; @@ -41,6 +43,16 @@ public static EntityManager getEntityManager() { throw implementationInjectionMissing(); } + /** + * Returns the {@link Session} for this entity class for extra operations (eg. CriteriaQueries) + * + * @return the {@link Session} for this entity class + */ + @GenerateBridge + public static Session getSession() { + throw implementationInjectionMissing(); + } + /** * Persist this entity in the database, if not already persisted. This will set your ID field if it is not already set. * diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java index 7a69d6604d325..ba0b6dc9c5139 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java @@ -11,6 +11,8 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.LockModeType; +import org.hibernate.Session; + import io.quarkus.panache.common.Parameters; import io.quarkus.panache.common.Sort; import io.quarkus.panache.common.impl.GenerateBridge; @@ -41,6 +43,16 @@ default EntityManager getEntityManager() { throw implementationInjectionMissing(); } + /** + * Returns the {@link Session} for the entity class for extra operations (eg. CriteriaQueries) + * + * @return the {@link Session} for the entity class + */ + @GenerateBridge + default Session getSession() { + throw implementationInjectionMissing(); + } + /** * Persist the given entity in the database, if not already persisted. * @@ -99,7 +111,7 @@ default boolean isPersistent(Entity entity) { * Flushes all pending changes to the database using the EntityManager for the entity class. */ default void flush() { - getEntityManager().flush(); + getSession().flush(); } // Queries diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/AdditionalJpaOperations.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/AdditionalJpaOperations.java index e0c9a7c729f1a..32d547b787ded 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/AdditionalJpaOperations.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/AdditionalJpaOperations.java @@ -8,12 +8,12 @@ import java.util.Map; import java.util.Set; -import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import jakarta.persistence.metamodel.Attribute; import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.Metamodel; +import org.hibernate.Session; import org.hibernate.engine.spi.CascadeStyle; import org.hibernate.engine.spi.CascadingActions; import org.hibernate.engine.spi.SessionImplementor; @@ -32,10 +32,10 @@ public class AdditionalJpaOperations { public static PanacheQuery find(AbstractJpaOperations jpaOperations, Class entityClass, String query, String countQuery, Sort sort, Map params) { String findQuery = createFindQuery(entityClass, query, jpaOperations.paramCount(params)); - EntityManager em = jpaOperations.getEntityManager(entityClass); - Query jpaQuery = em.createQuery(sort != null ? findQuery + toOrderBy(sort) : findQuery); + Session session = jpaOperations.getSession(entityClass); + Query jpaQuery = session.createQuery(sort != null ? findQuery + toOrderBy(sort) : findQuery); JpaOperations.bindParameters(jpaQuery, params); - return new CustomCountPanacheQuery(em, jpaQuery, countQuery, params); + return new CustomCountPanacheQuery(session, jpaQuery, countQuery, params); } public static PanacheQuery find(AbstractJpaOperations jpaOperations, Class entityClass, String query, @@ -47,20 +47,20 @@ public static PanacheQuery find(AbstractJpaOperations jpaOperations, Class public static PanacheQuery find(AbstractJpaOperations jpaOperations, Class entityClass, String query, String countQuery, Sort sort, Object... params) { String findQuery = createFindQuery(entityClass, query, jpaOperations.paramCount(params)); - EntityManager em = jpaOperations.getEntityManager(entityClass); - Query jpaQuery = em.createQuery(sort != null ? findQuery + toOrderBy(sort) : findQuery); + Session session = jpaOperations.getSession(entityClass); + Query jpaQuery = session.createQuery(sort != null ? findQuery + toOrderBy(sort) : findQuery); JpaOperations.bindParameters(jpaQuery, params); - return new CustomCountPanacheQuery(em, jpaQuery, countQuery, params); + return new CustomCountPanacheQuery(session, jpaQuery, countQuery, params); } public static long deleteAllWithCascade(AbstractJpaOperations jpaOperations, Class entityClass) { - EntityManager em = jpaOperations.getEntityManager(entityClass); + Session session = jpaOperations.getSession(entityClass); //detecting the case where there are cascade-delete associations, and do the bulk delete query otherwise. if (deleteOnCascadeDetected(jpaOperations, entityClass)) { int count = 0; List objects = jpaOperations.listAll(entityClass); for (Object entity : objects) { - em.remove(entity); + session.remove(entity); count++; } return count; @@ -77,12 +77,12 @@ public static long deleteAllWithCascade(AbstractJpaOperations jpaOperations, * @return true if cascading delete is needed. False otherwise */ private static boolean deleteOnCascadeDetected(AbstractJpaOperations jpaOperations, Class entityClass) { - EntityManager em = jpaOperations.getEntityManager(entityClass); - Metamodel metamodel = em.getMetamodel(); + Session session = jpaOperations.getSession(entityClass); + Metamodel metamodel = session.getMetamodel(); EntityType entity1 = metamodel.entity(entityClass); Set> declaredAttributes = ((EntityTypeImpl) entity1).getDeclaredAttributes(); - CascadeStyle[] propertyCascadeStyles = em.unwrap(SessionImplementor.class) + CascadeStyle[] propertyCascadeStyles = session.unwrap(SessionImplementor.class) .getEntityPersister(entityClass.getName(), null) .getPropertyCascadeStyles(); boolean doCascade = Arrays.stream(propertyCascadeStyles) @@ -96,12 +96,12 @@ private static boolean deleteOnCascadeDetected(AbstractJpaOperations jpaOpera public static long deleteWithCascade(AbstractJpaOperations jpaOperations, Class entityClass, String query, Object... params) { - EntityManager em = jpaOperations.getEntityManager(entityClass); + Session session = jpaOperations.getSession(entityClass); if (deleteOnCascadeDetected(jpaOperations, entityClass)) { int count = 0; List objects = jpaOperations.list(jpaOperations.find(entityClass, query, params)); for (Object entity : objects) { - em.remove(entity); + session.remove(entity); count++; } return count; @@ -112,12 +112,12 @@ public static long deleteWithCascade(AbstractJpaOperations long deleteWithCascade(AbstractJpaOperations jpaOperations, Class entityClass, String query, Map params) { - EntityManager em = jpaOperations.getEntityManager(entityClass); + Session session = jpaOperations.getSession(entityClass); if (deleteOnCascadeDetected(jpaOperations, entityClass)) { int count = 0; List objects = jpaOperations.list(jpaOperations.find(entityClass, query, params)); for (Object entity : objects) { - em.remove(entity); + session.remove(entity); count++; } return count; diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/CustomCountPanacheQuery.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/CustomCountPanacheQuery.java index 5d2d173755d16..db0f7bdfbaaea 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/CustomCountPanacheQuery.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/CustomCountPanacheQuery.java @@ -1,8 +1,8 @@ package io.quarkus.hibernate.orm.panache.runtime; -import jakarta.persistence.EntityManager; import jakarta.persistence.Query; +import org.hibernate.Session; import org.hibernate.query.spi.AbstractQuery; import io.quarkus.hibernate.orm.panache.common.runtime.CommonPanacheQueryImpl; @@ -11,9 +11,9 @@ // see https://github.com/quarkusio/quarkus/issues/6214 public class CustomCountPanacheQuery extends PanacheQueryImpl { - public CustomCountPanacheQuery(EntityManager em, Query jpaQuery, String customCountQuery, + public CustomCountPanacheQuery(Session session, Query jpaQuery, String customCountQuery, Object paramsArrayOrMap) { - super(new CommonPanacheQueryImpl<>(em, castQuery(jpaQuery).getQueryString(), null, null, paramsArrayOrMap) { + super(new CommonPanacheQueryImpl<>(session, castQuery(jpaQuery).getQueryString(), null, null, paramsArrayOrMap) { { this.countQuery = customCountQuery; } diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/JpaOperations.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/JpaOperations.java index ab0f0dbc6a72d..352948742fc4d 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/JpaOperations.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/JpaOperations.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.stream.Stream; -import jakarta.persistence.EntityManager; +import org.hibernate.Session; import io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations; @@ -14,9 +14,9 @@ public class JpaOperations extends AbstractJpaOperations> { public static final JpaOperations INSTANCE = new JpaOperations(); @Override - protected PanacheQueryImpl createPanacheQuery(EntityManager em, String query, String originalQuery, String orderBy, + protected PanacheQueryImpl createPanacheQuery(Session session, String query, String originalQuery, String orderBy, Object paramsArrayOrMap) { - return new PanacheQueryImpl<>(em, query, originalQuery, orderBy, paramsArrayOrMap); + return new PanacheQueryImpl<>(session, query, originalQuery, orderBy, paramsArrayOrMap); } @Override diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/PanacheQueryImpl.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/PanacheQueryImpl.java index 900f2bf1ac710..c8d79ad02feae 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/PanacheQueryImpl.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/runtime/PanacheQueryImpl.java @@ -6,9 +6,10 @@ import java.util.Optional; import java.util.stream.Stream; -import jakarta.persistence.EntityManager; import jakarta.persistence.LockModeType; +import org.hibernate.Session; + import io.quarkus.hibernate.orm.panache.PanacheQuery; import io.quarkus.hibernate.orm.panache.common.runtime.CommonPanacheQueryImpl; import io.quarkus.panache.common.Page; @@ -18,8 +19,8 @@ public class PanacheQueryImpl implements PanacheQuery { private CommonPanacheQueryImpl delegate; - PanacheQueryImpl(EntityManager em, String query, String originalQuery, String orderBy, Object paramsArrayOrMap) { - this.delegate = new CommonPanacheQueryImpl<>(em, query, originalQuery, orderBy, paramsArrayOrMap); + PanacheQueryImpl(Session session, String query, String originalQuery, String orderBy, Object paramsArrayOrMap) { + this.delegate = new CommonPanacheQueryImpl<>(session, query, originalQuery, orderBy, paramsArrayOrMap); } protected PanacheQueryImpl(CommonPanacheQueryImpl delegate) { diff --git a/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/EntityDataAccessImplementor.java b/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/EntityDataAccessImplementor.java index e4bf84b53aaf7..3e17564a90f25 100644 --- a/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/EntityDataAccessImplementor.java +++ b/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/EntityDataAccessImplementor.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import jakarta.persistence.EntityManager; +import org.hibernate.Session; import io.quarkus.gizmo.BytecodeCreator; import io.quarkus.gizmo.ResultHandle; @@ -97,10 +97,10 @@ public ResultHandle persist(BytecodeCreator creator, ResultHandle entity) { */ @Override public ResultHandle update(BytecodeCreator creator, ResultHandle entity) { - ResultHandle entityManager = creator.invokeStaticMethod( - ofMethod(entityClassName, "getEntityManager", EntityManager.class)); + ResultHandle session = creator.invokeStaticMethod( + ofMethod(entityClassName, "getSession", Session.class)); return creator.invokeInterfaceMethod( - ofMethod(EntityManager.class, "merge", Object.class, Object.class), entityManager, entity); + ofMethod(Session.class, "merge", Object.class, Object.class), session, entity); } /** diff --git a/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/RepositoryDataAccessImplementor.java b/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/RepositoryDataAccessImplementor.java index 66b8ef916ecd7..2f560610164cb 100644 --- a/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/RepositoryDataAccessImplementor.java +++ b/extensions/panache/hibernate-orm-rest-data-panache/deployment/src/main/java/io/quarkus/hibernate/orm/rest/data/panache/deployment/RepositoryDataAccessImplementor.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import jakarta.persistence.EntityManager; +import org.hibernate.Session; import io.quarkus.arc.Arc; import io.quarkus.arc.ArcContainer; @@ -98,15 +98,15 @@ public ResultHandle persist(BytecodeCreator creator, ResultHandle entity) { } /** - * Implements JpaOperations.getEntityManager().merge(entity) + * Implements JpaOperations.getSession().merge(entity) */ @Override public ResultHandle update(BytecodeCreator creator, ResultHandle entity) { - MethodDescriptor getEntityManager = ofMethod(PanacheRepositoryBase.class, "getEntityManager", - EntityManager.class); - ResultHandle entityManager = creator.invokeInterfaceMethod(getEntityManager, getRepositoryInstance(creator)); + MethodDescriptor getSession = ofMethod(PanacheRepositoryBase.class, "getSession", + Session.class); + ResultHandle session = creator.invokeInterfaceMethod(getSession, getRepositoryInstance(creator)); return creator.invokeInterfaceMethod( - ofMethod(EntityManager.class, "merge", Object.class, Object.class), entityManager, entity); + ofMethod(Session.class, "merge", Object.class, Object.class), session, entity); } /** diff --git a/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/StockMethodsAdder.java b/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/StockMethodsAdder.java index f8fa8fce729a0..372e6a05fe75e 100644 --- a/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/StockMethodsAdder.java +++ b/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/StockMethodsAdder.java @@ -16,9 +16,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import jakarta.persistence.EntityManager; import jakarta.transaction.Transactional; +import org.hibernate.Session; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget; import org.jboss.jandex.ClassInfo; @@ -240,13 +240,13 @@ private void generatePersistAndReturn(ResultHandle entity, BytecodeCreator bytec private void generateMergeAndReturn(ResultHandle entity, BytecodeCreator bytecodeCreator, FieldDescriptor entityClassFieldDescriptor) { ResultHandle entityClass = bytecodeCreator.readInstanceField(entityClassFieldDescriptor, bytecodeCreator.getThis()); - ResultHandle entityManager = bytecodeCreator.invokeVirtualMethod( - ofMethod(AbstractJpaOperations.class, "getEntityManager", EntityManager.class, Class.class), + ResultHandle session = bytecodeCreator.invokeVirtualMethod( + ofMethod(AbstractJpaOperations.class, "getSession", Session.class, Class.class), bytecodeCreator.readStaticField(operationsField), entityClass); entity = bytecodeCreator.invokeInterfaceMethod( - MethodDescriptor.ofMethod(EntityManager.class, "merge", Object.class, Object.class), - entityManager, entity); + MethodDescriptor.ofMethod(Session.class, "merge", Object.class, Object.class), + session, entity); bytecodeCreator.returnValue(entity); } diff --git a/extensions/spring-data-jpa/runtime/src/main/java/io/quarkus/spring/data/runtime/RepositorySupport.java b/extensions/spring-data-jpa/runtime/src/main/java/io/quarkus/spring/data/runtime/RepositorySupport.java index 2da94e173b573..8588b7223537c 100644 --- a/extensions/spring-data-jpa/runtime/src/main/java/io/quarkus/spring/data/runtime/RepositorySupport.java +++ b/extensions/spring-data-jpa/runtime/src/main/java/io/quarkus/spring/data/runtime/RepositorySupport.java @@ -4,8 +4,6 @@ import java.util.List; import java.util.Objects; -import jakarta.persistence.EntityManager; - import io.quarkus.hibernate.orm.panache.Panache; import io.quarkus.hibernate.orm.panache.PanacheQuery; import io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations; @@ -42,16 +40,14 @@ public static void deleteAll(AbstractJpaOperations> operations, } public static Object getOne(AbstractJpaOperations> operations, Class entityClass, Object id) { - return operations.getEntityManager(entityClass).getReference(entityClass, id); + return operations.getSession(entityClass).getReference(entityClass, id); } public static void clear(Class clazz) { - EntityManager em = Panache.getEntityManager(clazz); - em.clear(); + Panache.getSession(clazz).clear(); } public static void flush(Class clazz) { - EntityManager em = Panache.getEntityManager(clazz); - em.flush(); + Panache.getSession(clazz).clear(); } } diff --git a/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/TestEndpoint.java b/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/TestEndpoint.java index c23d14420743f..33b34fc47bcb8 100644 --- a/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/TestEndpoint.java +++ b/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/TestEndpoint.java @@ -622,6 +622,7 @@ private void testPersist(PersistTest persistTest) { public String testModelDao() { personDao.flush(); Assertions.assertNotNull(personDao.getEntityManager()); + Assertions.assertNotNull(personDao.getSession()); List persons = personDao.findAll().list(); Assertions.assertEquals(0, persons.size());