Так, можна використовувати @Transactional на приватних методах, але, як згадували інші, це не вийде. Вам потрібно використовувати AspectJ. Знадобилося трохи часу, щоб зрозуміти, як змусити його працювати. Я поділюся своїми результатами.
Я вирішив використовувати плетіння під час компіляції замість плетіння часу, оскільки я вважаю, що це загальний кращий варіант. Також я використовую Java 8, тому вам може знадобитися коригування деяких параметрів.
По-перше, додайте залежність для aspektrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Потім додайте плагін AspectJ, щоб зробити власне сплетення байтових кодів у Maven (це може бути не мінімальний приклад).
<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>
Нарешті додайте це у свій клас конфігурацій
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Тепер ви повинні мати можливість використовувати @Transactional на приватних методах.
Одне застереження до цього підходу: Вам потрібно буде налаштувати свій IDE так, щоб він знав про AspectJ, інакше якщо, наприклад, запустити додаток через Eclipse, він може не працювати. Переконайтесь, що ви протестуєте проти прямої конструкції Maven як перевірку здоровості