Oui, il est possible d'utiliser @Transactional sur des méthodes privées, mais comme d'autres l'ont mentionné, cela ne fonctionnera pas hors de la boîte. Vous devez utiliser AspectJ. Il m'a fallu un certain temps pour comprendre comment le faire fonctionner. Je partagerai mes résultats.
J'ai choisi d'utiliser le tissage au moment de la compilation au lieu du tissage au temps de chargement parce que je pense que c'est une meilleure option globale. En outre, j'utilise Java 8, vous devrez donc peut-être ajuster certains paramètres.
Tout d'abord, ajoutez la dépendance pour aspectjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Ajoutez ensuite le plugin AspectJ pour effectuer le tissage de bytecode réel dans Maven (ce n'est peut-être pas un exemple minimal).
<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>
Enfin, ajoutez ceci à votre classe de configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Vous devriez maintenant pouvoir utiliser @Transactional sur des méthodes privées.
Une mise en garde à cette approche: vous devrez configurer votre IDE pour être au courant d'AspectJ sinon si vous exécutez l'application via Eclipse par exemple, cela peut ne pas fonctionner. Assurez-vous de tester par rapport à une construction Maven directe comme test de santé mentale.