Ja, es ist möglich, @Transactional für private Methoden zu verwenden, aber wie andere bereits erwähnt haben, funktioniert dies nicht sofort. Sie müssen AspectJ verwenden. Ich brauchte einige Zeit, um herauszufinden, wie ich es zum Laufen bringen konnte. Ich werde meine Ergebnisse teilen.
Ich habe mich für das Weben zur Kompilierungszeit anstelle des Webens zur Ladezeit entschieden, da ich denke, dass dies eine insgesamt bessere Option ist. Außerdem verwende ich Java 8, sodass Sie möglicherweise einige Parameter anpassen müssen.
Fügen Sie zunächst die Abhängigkeit für aspectjrt hinzu.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Fügen Sie dann das AspectJ-Plugin hinzu, um das eigentliche Bytecode-Weben in Maven durchzuführen (dies ist möglicherweise kein minimales Beispiel).
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
Fügen Sie dies schließlich Ihrer Konfigurationsklasse hinzu
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Jetzt sollten Sie @Transactional für private Methoden verwenden können.
Eine Einschränkung bei diesem Ansatz: Sie müssen Ihre IDE so konfigurieren, dass Sie AspectJ kennen. Andernfalls funktioniert die App möglicherweise nicht, wenn Sie sie über Eclipse ausführen. Stellen Sie sicher, dass Sie einen Test gegen einen direkten Maven-Build durchführen.