Sí, es posible utilizar @Transactional en métodos privados, pero como otros han mencionado, esto no funcionará de la caja. Necesitas usar AspectJ. Me llevó algo de tiempo descubrir cómo hacerlo funcionar. Compartiré mis resultados.
Elegí usar el tejido en tiempo de compilación en lugar del tejido en tiempo de carga porque creo que es una mejor opción general. Además, estoy usando Java 8 por lo que es posible que deba ajustar algunos parámetros.
Primero, agregue la dependencia para aspectjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Luego agregar el plugin AspectJ para hacer el tejido de bytecode real en Maven (esto puede no ser un ejemplo mínimo).
<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>
Por último agregar esto a su clase de configuración
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Ahora usted debería ser capaz de utilizar @Transactional en métodos privados.
Una advertencia para este enfoque: Deberá configurar su IDE para conocer AspectJ; de lo contrario, si ejecuta la aplicación a través de Eclipse, es posible que no funcione. Asegúrate de probar contra una construcción directa de Maven como un control de cordura.
¿Estás seguro de esto? No esperaría que haga la diferencia. – willcodejavaforfood
Aunque funcionará con mode = "aspectj". – waxwing
@willcodejavaforfood: Ver la cita – skaffman