2014-09-23 38 views
6

Tôi đang cố gắng hiểu vị trí phù hợp để đặt @EnableTransactionManagement chú thích trong trường hợp có nhiều ngữ cảnh JavaConfig là gì?Phạm vi của @EnableTransactionManagement là gì?

Xem xét kịch bản sau: Tôi có cấu hình JPA trong tệp JPAConfig.java và AppConfig.java với nhóm hạt dịch vụ. Sau đó, tôi soạn cấu hình ứng dụng tổng thể trong RootConfig.java.

Tôi xác định người quản lý giao dịch trong JPAConfig.java cũng như cho phép quét đối với các kho lưu trữ JPA - vì chúng hiển thị hành vi giao dịch, tôi đặt @EnableTransactionManagement qua JPAConfig và nó hoạt động.

Tuy nhiên, một số hạt dịch vụ cũng cần phải có phương thức giao dịch, ví dụ: truy cập một số kho lưu trữ trong một giao dịch duy nhất. Tôi cũng có nên đặt @EnableTransactionManagement trên AppConfig không? Nhìn vào việc thực hiện chú thích này dường như với tôi rằng cách tiếp cận như vậy sẽ gây ra định nghĩa lại một số hạt cà phê. Và thực sự làm như vậy dường như không hiệu quả với tôi.

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories("com.mypackage.repositories") 
public class JPAConfig { 
// ... here are EntityManager and PlatformTransactionManager beans 
} 


@Configuration 
@ComponentScan("com.mypackage.services") 
// @EnableTransactionManagement // - ??? 
public class AppConfig { 
} 

@Configuration 
@Import({AppConfig.class, JPAConfig.class}) 
public class RootConfig { 
} 

Đánh giá cao mọi lời khuyên.

+1

Chú thích đó thêm công cụ quản lý giao dịch vào toàn bộ ngữ cảnh ứng dụng. Đó là phạm vi của nó. –

+1

Nhưng nó dường như không cho phép xử lý chú thích giao dịch cho toàn bộ RootConfig. Ít nhất, nó không làm việc cho tôi. –

Trả lời

10

Sau khi một số thí nghiệm tôi dường như đã tìm thấy câu trả lời bản thân mình:

  • Không cần phải cấu hình @EnableTransactionManagement trên mỗi mảnh cấu hình bối cảnh mặc dù nó không thành vấn đề như thế nào đầu chú thích này được phát hiện khi nó đăng ký internalTransactionAdvisor thực sự xử lý các chú thích @Transactional trên hạt đã tạo.
  • Trong trường hợp của tôi, tôi đã thay đổi thứ tự các ngữ cảnh trong kê khai @Import để rằng PersistenceConfig giữ @EnableTransactionManagement là trước tiên. Sau khi đậu này từ các phần khác có thể sử dụng AOP khai báo giao dịch.
  • Thông báo trước khác liên quan đến việc sử dụng đồng thời @EnableTransactionManagement@EnableGlobalMethodSecurity. Bảo mật phương pháp toàn cầu sử dụng xử lý bài đậu có vẻ như yêu cầu toàn bộ cấu hình bảo mật được kết nối. BeanPostProcessors được tạo sớm trong bối cảnh khởi động để bạn không thể sử dụng khai báo @Transactional trong bất kỳ bean nào cần thiết để bảo mật mùa xuân bootstrap (trong trường hợp của tôi UserDetailsContextMapper) - cố vấn chưa được tạo ra sau đó!
+0

Làm thế nào bạn quản lý để có được Giao dịch với cấu hình bảo mật mùa xuân của bạn? – Tarator

+0

Đã lâu rồi :) Theo như tôi nhớ, tôi mới kết thúc bằng một giao dịch có lập trình. Nó thực sự là một nơi duy nhất khi nó là cần thiết để giải pháp như vậy phù hợp với tôi tốt. –

Các vấn đề liên quan