Có, có thể sử dụng @Transactional trên các phương thức riêng tư, nhưng như những người khác đã đề cập, điều này sẽ không hoạt động. Bạn cần sử dụng AspectJ. Tôi phải mất một thời gian để tìm ra cách làm cho nó hoạt động. Tôi sẽ chia sẻ kết quả của tôi.
Tôi đã chọn sử dụng dệt thời gian biên dịch thay vì dệt thời gian tải vì tôi nghĩ đó là một lựa chọn tốt hơn về tổng thể. Ngoài ra, tôi đang sử dụng Java 8 nên bạn có thể cần điều chỉnh một số tham số.
Đầu tiên, thêm sự phụ thuộc cho facjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Sau đó, thêm plugin AspectJ để thực hiện việc dệt mã byte thực tế trong Maven (đây có thể không phải là một ví dụ tối thiểu).
<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>
Cuối cùng thêm nó vào lớp cấu hình của bạn
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Bây giờ bạn sẽ có thể sử dụng @Transactional trên các phương thức riêng tư.
Một lưu ý cho cách tiếp cận này: Bạn sẽ cần cấu hình IDE của mình để nhận biết về AspectJ nếu không, nếu bạn chạy ứng dụng qua Eclipse chẳng hạn, nó có thể không hoạt động. Hãy chắc chắn rằng bạn đã kiểm tra bản dựng Maven trực tiếp dưới dạng kiểm tra độ tỉnh táo.