Tak, można używać @Transactional na prywatnych metodach, ale jak wspomnieli inni, nie będzie to działać od razu po wyjęciu z pudełka. Musisz użyć AspectJ. Zajęło mi trochę czasu, aby dowiedzieć się, jak to działa. Podzielę się swoimi wynikami.
Wybrałem tkanie w czasie kompilacji zamiast tkania w czasie ładowania, ponieważ uważam, że jest to ogólnie lepsza opcja. Używam także Java 8, więc może być konieczne dostosowanie niektórych parametrów.
Najpierw dodaj zależność aspekjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Następnie dodaj wtyczkę AspectJ, aby wykonać rzeczywiste tkanie kodu bajtowego w Maven (może to nie być minimalny przykład).
<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>
Na koniec dodaj to do swojej klasy config
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Teraz powinieneś być w stanie używać @Transactional na prywatnych metodach.
Jedno zastrzeżenie do tego podejścia: Musisz skonfigurować IDE, aby mieć świadomość AspectJ, w przeciwnym razie, jeśli uruchomisz aplikację za pośrednictwem Eclipse, na przykład może nie działać. Upewnij się, że testujesz na bezpośredniej kompilacji Maven jako sprawdzian zdrowia.