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 71ed24a451..eacb0d1a3c 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 @@ -137,11 +137,6 @@ public class AnnotationMetaEntity extends AnnotationMeta { */ private boolean repository = false; - /** - * A repository type that this repository inherits. - */ - private @Nullable TypeMirror superRepository; - /** * The type of the "session getter" method of a DAO-style repository. */ @@ -221,15 +216,7 @@ public final String getQualifiedName() { @Override public @Nullable String getSupertypeName() { if ( repository ) { - if ( superRepository == null ) { - return null; - } - else { - final DeclaredType declaredType = (DeclaredType) superRepository; - final TypeElement typeElement = (TypeElement) declaredType.asElement(); - // the import should already have been added earlier - return importType( typeElement.getQualifiedName().toString() ); - } + return null; } else { return findMappedSuperClass( this, context ); @@ -237,7 +224,7 @@ public final String getQualifiedName() { } @Override - public final String getPackageName() { + public String getPackageName() { return getPackageName( context, element ); } @@ -350,42 +337,47 @@ public String toString() { protected final void init() { getContext().logMessage( Diagnostic.Kind.OTHER, "Initializing type '" + getQualifiedName() + "'" ); - determineAccessTypeForHierarchy( element, context ); - entityAccessTypeInfo = castNonNull( context.getAccessTypeInfo( getQualifiedName() ) ); - - final List fieldsOfClass = fieldsIn( element.getEnclosedElements() ); - final List methodsOfClass = methodsIn( element.getEnclosedElements() ); - final List gettersAndSettersOfClass = new ArrayList<>(); - final List queryMethods = new ArrayList<>(); - final List lifecycleMethods = new ArrayList<>(); - for ( ExecutableElement method: methodsOfClass ) { - if ( isGetterOrSetter( method ) ) { - gettersAndSettersOfClass.add( method ); - } - else if ( containsAnnotation( method, HQL, SQL, JD_QUERY, FIND, JD_FIND ) ) { - queryMethods.add( method ); - } - else if ( containsAnnotation( method, JD_INSERT, JD_UPDATE, JD_DELETE, JD_SAVE ) ) { - lifecycleMethods.add( method ); - } - } - setupSession(); + final List queryMethods = new ArrayList<>(); + final List lifecycleMethods = new ArrayList<>(); + if ( repository ) { - superRepository = findSuperRepository( element ); - if ( superRepository != null ) { - importType( superRepository.toString() ); + final List methodsOfClass = new ArrayList<>(); + addMethods( element, methodsOfClass ); + for ( ExecutableElement method: methodsOfClass ) { + if ( containsAnnotation( method, HQL, SQL, JD_QUERY, FIND, JD_FIND ) ) { + queryMethods.add( method ); + } + else if ( containsAnnotation( method, JD_INSERT, JD_UPDATE, JD_DELETE, JD_SAVE ) ) { + lifecycleMethods.add( method ); + } } } + else { + determineAccessTypeForHierarchy( element, context ); + entityAccessTypeInfo = castNonNull( context.getAccessTypeInfo( getQualifiedName() ) ); - if ( managed && !jakartaDataStaticModel ) { - putMember( "class", new AnnotationMetaType(this) ); + final List fieldsOfClass = fieldsIn( element.getEnclosedElements() ); + final List methodsOfClass = methodsIn( element.getEnclosedElements() ); + final List gettersAndSettersOfClass = new ArrayList<>(); + for ( ExecutableElement method: methodsOfClass ) { + if ( isGetterOrSetter( method ) ) { + gettersAndSettersOfClass.add( method ); + } + else if ( containsAnnotation( method, HQL, SQL, FIND ) ) { + queryMethods.add( method ); + } + } + + if ( managed && !jakartaDataStaticModel ) { + putMember( "class", new AnnotationMetaType(this) ); + } + + addPersistentMembers( fieldsOfClass, AccessType.FIELD ); + addPersistentMembers( gettersAndSettersOfClass, AccessType.PROPERTY ); } - addPersistentMembers( fieldsOfClass, AccessType.FIELD ); - addPersistentMembers( gettersAndSettersOfClass, AccessType.PROPERTY ); - addAuxiliaryMembers(); checkNamedQueries(); @@ -397,6 +389,18 @@ else if ( containsAnnotation( method, JD_INSERT, JD_UPDATE, JD_DELETE, JD_SAVE ) initialized = true; } + private void addMethods(TypeElement element, List methodsOfClass) { + for ( TypeMirror typeMirror : element.getInterfaces() ) { + final DeclaredType declaredType = (DeclaredType) typeMirror; + final TypeElement typeElement = (TypeElement) declaredType.asElement(); + addMethods( typeElement, methodsOfClass ); + } + for ( ExecutableElement method : methodsIn( element.getEnclosedElements() ) ) { + methodsOfClass.removeIf( m -> context.getElementUtils().overrides(method, m, element) ); + methodsOfClass.add( method ); + } + } + private void addDefaultConstructor() { final String sessionVariableName = getSessionVariableName(sessionType); final String typeName = element.getSimpleName().toString() + '_'; @@ -452,30 +456,6 @@ else if ( element.getKind() == ElementKind.INTERFACE } } - private @Nullable TypeMirror findSuperRepository(TypeElement type) { - for ( TypeMirror superinterface : type.getInterfaces() ) { - if ( superinterface.getKind() == TypeKind.DECLARED ) { - final DeclaredType declaredType = (DeclaredType) superinterface; - final TypeElement typeElement = (TypeElement) declaredType.asElement(); - if ( hasAnnotation( typeElement, JD_REPOSITORY ) ) { - return superinterface; - } - else if ( typeElement.getEnclosedElements().stream() - .anyMatch( member -> hasAnnotation( member, - HQL, SQL, JD_QUERY, FIND, JD_FIND, JD_INSERT, JD_UPDATE, JD_DELETE, JD_SAVE ) ) ) { - return superinterface; - } - else { - final TypeMirror ret = findSuperRepository( typeElement ); - if ( ret != null ) { - return ret; - } - } - } - } - return null; - } - private @Nullable ExecutableElement findSessionGetter(TypeElement type) { if ( !hasAnnotation( type, ENTITY, MAPPED_SUPERCLASS, EMBEDDABLE ) || isPanacheType( type ) ) {