ใช่เป็นไปได้ที่จะใช้ @Transactional ในวิธีการส่วนตัว แต่อย่างที่คนอื่น ๆ ได้กล่าวถึงสิ่งนี้จะไม่ได้ผล คุณต้องใช้ AspectJ ฉันใช้เวลาพอสมควรในการหาวิธีการทำงาน ฉันจะแบ่งปันผลลัพธ์ของฉัน
ฉันเลือกที่จะใช้การทอผ้าแบบคอมไพล์แทนการทอผ้าแบบโหลดโหลดเพราะฉันคิดว่ามันเป็นตัวเลือกที่ดีกว่าโดยรวม นอกจากนี้ฉันใช้ Java 8 ดังนั้นคุณอาจต้องปรับพารามิเตอร์บางอย่าง
ก่อนอื่นให้เพิ่มการพึ่งพาสำหรับกว้างยาว
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
จากนั้นเพิ่มปลั๊กอิน AspectJ เพื่อทำ bytecode ที่แท้จริงใน 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>
ในที่สุดเพิ่มสิ่งนี้ไปยังระดับ config ของคุณ
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
ตอนนี้คุณควรจะสามารถใช้ @Transactional บนวิธีการส่วนตัวได้
ข้อแม้หนึ่งสำหรับวิธีนี้: คุณจะต้องกำหนดค่า IDE ของคุณให้ระวัง AspectJ ไม่เช่นนั้นหากคุณเรียกใช้แอปผ่าน Eclipse เช่นอาจไม่ทำงาน ตรวจสอบให้แน่ใจว่าคุณทดสอบกับ Maven build โดยตรงเป็นการตรวจสอบสติ