From 7f5bedd0d73bc3289e03e8b7da94aab735d27577 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sun, 13 Jul 2025 14:26:23 +0200 Subject: [PATCH] HHH-19606 allow resource accessor method of type StatelessSession in Spring this is a partial fix: need to consider other session types eventually --- .../annotation/AnnotationMetaEntity.java | 14 +++++++++----- .../annotation/RepositoryConstructor.java | 17 +++++++++++++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java index 6a293543e757..8eb7e067acbc 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java @@ -786,10 +786,10 @@ else if ( element.getKind() == ElementKind.INTERFACE } if ( !repository && jakartaDataRepository ) { repository = true; - sessionType = springInjection - ? SPRING_STATELESS_SESSION_PROVIDER - : HIB_STATELESS_SESSION; - addDaoConstructor( null ); + // Jakarta Data defaults to StatelessSession, not EntityManager + sessionType = HIB_STATELESS_SESSION; + // If it's Spring, we wrap the StatelessSession in ObjectProvider + sessionType = addDaoConstructor( null ); } if ( needsDefaultConstructor() ) { addDefaultConstructor(); @@ -895,7 +895,11 @@ private boolean isReactivePanacheType(TypeElement type) { * it. */ private String addDaoConstructor(@Nullable ExecutableElement method) { - final String sessionType = method == null ? this.sessionType : fullReturnType(method); + final String returnType = method == null ? this.sessionType : fullReturnType( method ); + final String sessionType = + jakartaDataRepository && springInjection + ? SPRING_OBJECT_PROVIDER + '<' + returnType + '>' + : returnType; final String sessionVariableName = getSessionVariableName( sessionType ); final String name = method == null ? sessionVariableName : method.getSimpleName().toString(); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java index be8ff0781d08..20727f6cfb95 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java @@ -9,6 +9,7 @@ import org.hibernate.processor.model.Metamodel; import org.hibernate.processor.util.Constants; +import static org.hibernate.processor.util.Constants.HIB_STATELESS_SESSION; import static org.hibernate.processor.util.Constants.INJECT; import static org.hibernate.processor.util.Constants.NONNULL; @@ -126,17 +127,29 @@ public String getAttributeDeclarationString() { .append("public "); notNull( declaration ); declaration - .append(annotationMetaEntity.importType(sessionTypeName)) + .append(annotationMetaEntity.importType(providedSessionType())) .append(" ") .append(methodName) .append("() {") .append("\n\treturn ") - .append(sessionVariableName) + .append(sessionVariableName); + if ( annotationMetaEntity.isProvidedSessionAccess() ) { + declaration + .append( ".getObject()" ); + } + declaration .append(";\n}"); } return declaration.toString(); } + private String providedSessionType() { + return annotationMetaEntity.isProvidedSessionAccess() + //TODO: assuming provided sessions are always StatelessSessions for now + ? HIB_STATELESS_SESSION + : sessionTypeName; + } + /** * In Quarkus we use the Quarkus-specific {@code @PersistenceUnit} * CDI qualifier annotation to inject the {@code StatelessSession}