Sì, è possibile utilizzare @Transactional su metodi privati, ma come altri hanno già detto questo non funzionerà immediatamente. Devi usare AspectJ. Mi ci è voluto del tempo per capire come farlo funzionare. Condividerò i miei risultati.
Ho scelto di usare la tessitura a tempo di compilazione anziché la tessitura a tempo di caricamento perché penso che sia un'opzione complessivamente migliore. Inoltre, sto usando Java 8, quindi potrebbe essere necessario regolare alcuni parametri.
Innanzitutto, aggiungi la dipendenza per aspectjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Quindi aggiungi il plug-in AspectJ per eseguire la tessitura bytecode effettiva in Maven (questo potrebbe non essere un esempio minimo).
<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>
Infine aggiungi questo alla tua classe di configurazione
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Ora dovresti essere in grado di utilizzare @Transactional su metodi privati.
Un avvertimento a questo approccio: dovrai configurare il tuo IDE per essere a conoscenza di AspectJ altrimenti, se ad esempio esegui l'app tramite Eclipse, potrebbe non funzionare. Assicurati di testare contro una build Maven diretta come controllo di integrità.