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 4533c9ddc703..583f29f0281f 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 @@ -11,17 +11,19 @@ import java.util.List; +import static jakarta.transaction.Transactional.TxType.REQUIRES_NEW; + @Repository public interface Bookshop extends CrudRepository { @Find - @Transactional + @Transactional(REQUIRES_NEW) List byPublisher(String publisher_name); @Find List byTitle(@Nonnull String title); @Query("select isbn where title like ?1 order by isbn") - String[] ssns(@NotBlank String title); + String[] ssns(@NotBlank String title); @Query("select count(this) where title like ?1 order by isbn") long count1(@NotNull String title); @@ -33,7 +35,7 @@ public interface Bookshop extends CrudRepository { int length(@Nonnull String title); @Query("select count(this)") - long countAll(); + long countAll(); @Query("where isbn in :isbns and type = Book") List books(List isbns); 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 fc24d625f027..6187066f6c22 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 @@ -10,8 +10,11 @@ import org.hibernate.processor.model.Metamodel; import javax.annotation.processing.FilerException; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; import javax.tools.Diagnostic; import javax.tools.FileObject; import java.io.IOException; @@ -94,7 +97,11 @@ private static StringBuffer generateBody(Metamodel entity, Context context) { if ( context.addSuppressWarningsAnnotation() ) { pw.println( writeSuppressWarnings(context) ); } - entity.inheritedAnnotations().forEach(pw::println); + entity.inheritedAnnotations() + .forEach( annotation -> { + printAnnotation( annotation, pw ); + pw.print('\n'); + } ); printClassDeclaration( entity, pw ); @@ -116,9 +123,10 @@ private static StringBuffer generateBody(Metamodel entity, Context context) { pw.println('\t' + line); if ( line.trim().startsWith("@Override") ) { metaMember.inheritedAnnotations() - .forEach(x -> { + .forEach(annotation -> { pw.print('\t'); - pw.println(x); + printAnnotation( annotation, pw ); + pw.print('\n'); }); } }); @@ -131,6 +139,62 @@ private static StringBuffer generateBody(Metamodel entity, Context context) { } } + private static void printAnnotation(AnnotationMirror annotation, PrintWriter pw) { + pw.print('@'); + final TypeElement type = (TypeElement) annotation.getAnnotationType().asElement(); + pw.print( type.getQualifiedName().toString() ); + var elementValues = annotation.getElementValues(); + if (!elementValues.isEmpty()) { + pw.print('('); + boolean first = true; + for (var entry : elementValues.entrySet()) { + if (first) { + first = false; + } + else { + pw.print(','); + } + pw.print( entry.getKey().getSimpleName() ); + pw.print( '=' ); + printAnnotationValue( pw, entry.getValue() ); + } + pw.print(')'); + } + } + + private static void printAnnotationValue(PrintWriter pw, AnnotationValue value) { + final Object argument = value.getValue(); + if (argument instanceof VariableElement) { + VariableElement variable = (VariableElement) argument; + pw.print( variable.getEnclosingElement() ); + pw.print('.'); + pw.print( variable.getSimpleName().toString() ); + } + else if (argument instanceof AnnotationMirror) { + AnnotationMirror childAnnotation = (AnnotationMirror) argument; + printAnnotation( childAnnotation, pw ); + } + else if (argument instanceof List) { + final List list = + (List) argument; + pw.print('{'); + boolean first = true; + for (AnnotationValue listedValue : list) { + if (first) { + first = false; + } + else { + pw.print(','); + } + printAnnotationValue( pw, listedValue ); + } + pw.print('}'); + } + else { + pw.print( argument ); + } + } + private static void printClassDeclaration(Metamodel entity, PrintWriter pw) { pw.print( "public " ); if ( !entity.isImplementation() && !entity.isJakartaDataStyle() ) {