diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/eg/Bookshop.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/eg/Bookshop.java index 85bc9eed28..d3e623a866 100644 --- a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/eg/Bookshop.java +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/eg/Bookshop.java @@ -3,11 +3,13 @@ package org.hibernate.processor.test.data.eg; import jakarta.data.repository.CrudRepository; import jakarta.data.repository.Find; import jakarta.data.repository.Repository; +import jakarta.transaction.Transactional; import java.util.List; @Repository public interface Bookshop extends CrudRepository { @Find + @Transactional List byPublisher(String publisher_name); } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java index b770e1c34e..3d496c8707 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java @@ -104,7 +104,16 @@ public final class ClassWriter { for ( MetaAttribute metaMember : members ) { if ( metaMember.hasTypedAttribute() ) { metaMember.getAttributeDeclarationString().lines() - .forEach(line -> pw.println('\t' + line)); + .forEach(line -> { + pw.println('\t' + line); + if ( line.trim().startsWith("@Override") ) { + metaMember.inheritedAnnotations() + .forEach(x -> { + pw.print('\t'); + pw.println(x); + }); + } + }); } } pw.println(); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java index 5e9aed56b7..2d201cadbb 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractAnnotatedMethod.java @@ -9,10 +9,17 @@ package org.hibernate.processor.annotation; import org.hibernate.processor.model.MetaAttribute; import org.hibernate.processor.model.Metamodel; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.ExecutableElement; +import java.util.List; + +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; import static org.hibernate.processor.annotation.AnnotationMetaEntity.usingReactiveSession; import static org.hibernate.processor.annotation.AnnotationMetaEntity.usingReactiveSessionAccess; import static org.hibernate.processor.annotation.AnnotationMetaEntity.usingStatelessSession; import static org.hibernate.processor.util.Constants.ENTITY_MANAGER; +import static org.hibernate.processor.util.TypeUtils.hasAnnotation; /** * @author Gavin King @@ -20,11 +27,16 @@ import static org.hibernate.processor.util.Constants.ENTITY_MANAGER; public abstract class AbstractAnnotatedMethod implements MetaAttribute { final AnnotationMetaEntity annotationMetaEntity; + private final ExecutableElement method; final String sessionType; final String sessionName; - public AbstractAnnotatedMethod(AnnotationMetaEntity annotationMetaEntity, String sessionName, String sessionType) { + public AbstractAnnotatedMethod( + AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, + String sessionName, String sessionType) { this.annotationMetaEntity = annotationMetaEntity; + this.method = method; this.sessionName = sessionName; this.sessionType = sessionType; } @@ -54,5 +66,16 @@ public abstract class AbstractAnnotatedMethod implements MetaAttribute { return isReactiveSessionAccess() ? "_session" : sessionName; } - + @Override + public List inheritedAnnotations() { + if ( annotationMetaEntity.isJakartaDataRepository() ) { + return method.getAnnotationMirrors().stream() + .filter(annotationMirror -> hasAnnotation(annotationMirror.getAnnotationType().asElement(), + "jakarta.interceptor.InterceptorBinding")) + .collect(toList()); + } + else { + return emptyList(); + } + } } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java index 2eb456c9d0..103e86fcfd 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java @@ -6,6 +6,7 @@ */ package org.hibernate.processor.annotation; +import javax.lang.model.element.ExecutableElement; import java.util.List; import java.util.StringTokenizer; @@ -21,6 +22,7 @@ public abstract class AbstractCriteriaMethod extends AbstractFinderMethod { public AbstractCriteriaMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String entity, boolean belongsToDao, String sessionType, String sessionName, @@ -32,7 +34,7 @@ public abstract class AbstractCriteriaMethod extends AbstractFinderMethod { boolean convertToDataExceptions, List multivalued, List paramPatterns) { - super(annotationMetaEntity, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, + super(annotationMetaEntity, method, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, paramNames, paramTypes, orderBys, addNonnullAnnotation, convertToDataExceptions); this.multivalued = multivalued; this.paramPatterns = paramPatterns; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java index 66e426b431..20ea52dcee 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java @@ -8,6 +8,7 @@ package org.hibernate.processor.annotation; import org.hibernate.internal.util.StringHelper; +import javax.lang.model.element.ExecutableElement; import java.util.List; import java.util.Locale; @@ -24,6 +25,7 @@ public abstract class AbstractFinderMethod extends AbstractQueryMethod { AbstractFinderMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String entity, boolean belongsToDao, @@ -35,7 +37,7 @@ public abstract class AbstractFinderMethod extends AbstractQueryMethod { List orderBys, boolean addNonnullAnnotation, boolean convertToDataExceptions) { - super( annotationMetaEntity, + super( annotationMetaEntity, method, methodName, paramNames, paramTypes, entity, sessionType, sessionName, diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java index dd8596a0d3..4266e09ee4 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java @@ -9,6 +9,7 @@ package org.hibernate.processor.annotation; import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.AssertionFailure; +import javax.lang.model.element.ExecutableElement; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -51,6 +52,7 @@ public abstract class AbstractQueryMethod extends AbstractAnnotatedMethod { AbstractQueryMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, List paramNames, List paramTypes, @Nullable String returnTypeName, @@ -60,7 +62,7 @@ public abstract class AbstractQueryMethod extends AbstractAnnotatedMethod { List orderBys, boolean addNonnullAnnotation, boolean dataRepository) { - super(annotationMetaEntity, sessionName, sessionType); + super(annotationMetaEntity, method, sessionName, sessionType); this.methodName = methodName; this.paramNames = paramNames; this.paramTypes = paramTypes; 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 63d688bc66..36874f9275 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 @@ -304,6 +304,10 @@ public class AnnotationMetaEntity extends AnnotationMeta { return repository; } + boolean isJakartaDataRepository() { + return jakartaDataRepository; + } + @Override String getSessionType() { return sessionType; @@ -1206,7 +1210,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { putMember( methodName + '.' + entity, new LifecycleMethod( - this, + this, method, entity, methodName, parameter.getSimpleName().toString(), @@ -1414,7 +1418,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { } putMember( methodKey, new CriteriaFinderMethod( - this, + this, method, methodName, returnType.toString(), containerType, @@ -1458,7 +1462,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { } putMember( methodKey, new CriteriaDeleteMethod( - this, + this, method, methodName, entity.getQualifiedName().toString(), returnType.toString(), @@ -1652,7 +1656,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { && matchesNaturalKey( entity, fieldTypes ) ) { putMember( methodKey, new NaturalIdFinderMethod( - this, + this, method, methodName, returnType.toString(), paramNames, @@ -1671,7 +1675,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { final List paramPatterns = parameterPatterns( method ); putMember( methodKey, new CriteriaFinderMethod( - this, + this, method, methodName, returnType.toString(), null, @@ -1709,7 +1713,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { case ID: putMember( methodKey, new IdFinderMethod( - this, + this, method, methodName, returnType.toString(), paramNames, @@ -1726,7 +1730,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { case NATURAL_ID: putMember( methodKey, new NaturalIdFinderMethod( - this, + this, method, methodName, returnType.toString(), paramNames, @@ -1746,7 +1750,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { final List paramPatterns = parameterPatterns( method ); putMember( methodKey, new CriteriaFinderMethod( - this, + this, method, methodName, returnType.toString(), null, @@ -2092,7 +2096,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { final QueryMethod attribute = new QueryMethod( - this, + this, method, method.getSimpleName().toString(), queryString, returnType == null ? null : returnType.toString(), diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java index 485a972877..7d828ac3a2 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaDeleteMethod.java @@ -6,6 +6,7 @@ */ package org.hibernate.processor.annotation; +import javax.lang.model.element.ExecutableElement; import java.util.List; import static java.util.Collections.emptyList; @@ -20,6 +21,7 @@ public class CriteriaDeleteMethod extends AbstractCriteriaMethod { CriteriaDeleteMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String entity, String returnType, List paramNames, List paramTypes, @@ -31,7 +33,7 @@ public class CriteriaDeleteMethod extends AbstractCriteriaMethod { String sessionName, boolean addNonnullAnnotation, boolean dataRepository) { - super( annotationMetaEntity, methodName, entity, belongsToDao, sessionType, sessionName, emptyList(), + super( annotationMetaEntity, method, methodName, entity, belongsToDao, sessionType, sessionName, emptyList(), paramNames, paramTypes, emptyList(), addNonnullAnnotation, dataRepository, multivalued, paramPatterns ); this.paramNullability = paramNullability; this.returnType = returnType; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java index add7d65af0..9824ef93f2 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java @@ -10,6 +10,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.AssertionFailure; import org.hibernate.processor.util.Constants; +import javax.lang.model.element.ExecutableElement; import java.util.List; /** @@ -22,6 +23,7 @@ public class CriteriaFinderMethod extends AbstractCriteriaMethod { CriteriaFinderMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String entity, @Nullable String containerType, List paramNames, List paramTypes, @@ -35,7 +37,7 @@ public class CriteriaFinderMethod extends AbstractCriteriaMethod { List orderBys, boolean addNonnullAnnotation, boolean dataRepository) { - super( annotationMetaEntity, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, + super( annotationMetaEntity, method, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, paramNames, paramTypes, orderBys, addNonnullAnnotation, dataRepository, multivalued, paramPatterns ); this.containerType = containerType; this.paramNullability = paramNullability; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java index 4603aee9e6..b165a0081c 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java @@ -6,6 +6,7 @@ */ package org.hibernate.processor.annotation; +import javax.lang.model.element.ExecutableElement; import java.util.List; import static java.util.Collections.emptyList; @@ -21,6 +22,7 @@ public class IdFinderMethod extends AbstractFinderMethod { public IdFinderMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String entity, List paramNames, List paramTypes, boolean belongsToDao, @@ -29,7 +31,7 @@ public class IdFinderMethod extends AbstractFinderMethod { List fetchProfiles, boolean addNonnullAnnotation, boolean dataRepository) { - super( annotationMetaEntity, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, + super( annotationMetaEntity, method, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, paramNames, paramTypes, emptyList(), addNonnullAnnotation, dataRepository ); int idParameter = idParameter(paramNames, paramTypes); this.paramName = paramNames.get(idParameter); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java index 4789513aa5..3d319112f2 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java @@ -6,6 +6,8 @@ */ package org.hibernate.processor.annotation; +import javax.lang.model.element.ExecutableElement; + import static org.hibernate.processor.util.Constants.UNI; public class LifecycleMethod extends AbstractAnnotatedMethod { @@ -19,6 +21,7 @@ public class LifecycleMethod extends AbstractAnnotatedMethod { public LifecycleMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String entity, String methodName, String parameterName, @@ -28,7 +31,7 @@ public class LifecycleMethod extends AbstractAnnotatedMethod { boolean addNonnullAnnotation, boolean iterateParameter, boolean returnArgument) { - super(annotationMetaEntity, sessionName, sessionType); + super(annotationMetaEntity, method, sessionName, sessionType); this.entity = entity; this.methodName = methodName; this.parameterName = parameterName; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java index f6b90c8751..6605e4a8f9 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java @@ -6,6 +6,7 @@ */ package org.hibernate.processor.annotation; +import javax.lang.model.element.ExecutableElement; import java.util.List; import static java.util.Collections.emptyList; @@ -19,6 +20,7 @@ public class NaturalIdFinderMethod extends AbstractFinderMethod { public NaturalIdFinderMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String entity, List paramNames, List paramTypes, List paramNullability, @@ -28,7 +30,7 @@ public class NaturalIdFinderMethod extends AbstractFinderMethod { List fetchProfiles, boolean addNonnullAnnotation, boolean dataRepository) { - super( annotationMetaEntity, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, + super( annotationMetaEntity, method, methodName, entity, belongsToDao, sessionType, sessionName, fetchProfiles, paramNames, paramTypes, emptyList(), addNonnullAnnotation, dataRepository ); this.paramNullability = paramNullability; } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java index 558a0a3840..5f69ca286f 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java @@ -10,6 +10,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.AssertionFailure; import org.hibernate.internal.util.StringHelper; +import javax.lang.model.element.ExecutableElement; import java.util.List; import static org.hibernate.processor.util.Constants.QUERY; @@ -28,6 +29,7 @@ public class QueryMethod extends AbstractQueryMethod { QueryMethod( AnnotationMetaEntity annotationMetaEntity, + ExecutableElement method, String methodName, String queryString, @Nullable @@ -44,7 +46,7 @@ public class QueryMethod extends AbstractQueryMethod { List orderBys, boolean addNonnullAnnotation, boolean dataRepository) { - super( annotationMetaEntity, + super( annotationMetaEntity, method, methodName, paramNames, paramTypes, returnTypeName, sessionType, sessionName, diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/MetaAttribute.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/MetaAttribute.java index 7bc452d73e..2fb1ee5d90 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/MetaAttribute.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/MetaAttribute.java @@ -6,6 +6,11 @@ */ package org.hibernate.processor.model; +import javax.lang.model.element.AnnotationMirror; +import java.util.List; + +import static java.util.Collections.emptyList; + /** * @author Hardy Ferentschik */ @@ -27,4 +32,7 @@ public interface MetaAttribute { Metamodel getHostingEntity(); + default List inheritedAnnotations() { + return emptyList(); + } }