Tôi không hiểu rõ về cách thức hoạt động của Seam nên tôi xin lỗi trước nếu câu trả lời này không phù hợp.
Tôi nhận thấy rằng phương thức @Transactional
protected
. Điều này ngụ ý với tôi rằng nó đang được gọi bằng một phương thức nội bộ khác.
Với Spring's AOP, bạn đánh dấu công chúng phương thức với @Transactional
được bao bọc và thay thế bằng proxy giao dịch. Khi một lớp bên ngoài gọi public
phương thức, nó đang gọi proxy tạo thành giao dịch. Nếu lớp bên ngoài gọi một public
khác phương pháp đó không được đánh dấu bằng @Transactional
mà sau đó gọi một phương thức nội bộ, nghĩa là sẽ không có giao dịch nào được tạo vì proxy hoàn toàn không được gọi.
Vào mùa xuân, ngay cả khi bạn thay đổi doWork()
của mình phương pháp công khai, vấn đề tương tự sẽ xảy ra. Không có giao dịch vì đối tượng proxy không được gọi. Các cuộc gọi phương thức được thực hiện bên trong lớp sẽ không thực hiện cuộc gọi đến đối tượng proxy.
Đọc nhanh một số tài liệu dường như cho thấy rằng, giống như Spring AOP, Seam đang sử dụng CGLib ủy quyền . Câu hỏi đặt ra là liệu nó có thể ủy quyền cho tất cả các phương thức - ngay cả khi chúng được gọi từ bên trong đối tượng được ủy quyền. Xin lỗi vì đã làm mất thời gian của bạn nếu câu trả lời này không áp dụng.