2012-01-24 29 views
8

Tôi đang sử dụng Spring MVC với Hibernatedaosupport cho các lớp DAO của tôi. Nhầm lẫn ở đây, nơi để bắt đầu giao dịch, cho dù nó nên được trong lớp dịch vụ hoặc lớp DAO?Cách nào đúng để sử dụng Spring MVC với Hibernate trong DAO, kiến ​​trúc lớp dịch vụ

Chế độ xem của tôi tương tác với Lớp dịch vụ. DAO được tiêm vào dịch vụ.

Cách nào đúng để sử dụng Spring MVC với Hibernate trong DAO, kiến ​​trúc lớp dịch vụ?

+0

u có thể giải thích cho tôi rõ ràng ... –

+0

@JustinThomas Đó là như hữu ích, nhưng khác nhau. –

Trả lời

20

IMHO giao dịch sẽ chuyển sang lớp dịch vụ. Thông thường, một giao dịch kinh doanh bao gồm một số truy vấn và cập nhật. Nếu bạn đặt @Transactional chỉ trên DAO lớp, mỗi truy vấn và cập nhật sẽ chạy trong một giao dịch riêng biệt, có hiệu quả đánh bại mục đích của giao dịch.

Nhưng nếu dịch vụ là @Transactional, mỗi tương tác cơ sở dữ liệu sẽ tham gia một giao dịch chính bắt đầu khi lớp web được nhập vào lớp dịch vụ. Lưu ý rằng trong trường hợp này nếu lớp web chạy một số phương thức dịch vụ, mỗi lớp sẽ chạy trong một giao dịch riêng biệt (cùng một vấn đề đã chuyển lên một cấp). Tuy nhiên, việc đặt @Transactional trong lớp web có thể giới thiệu các hiệu ứng phụ không mong muốn như vấn đề N + 1, sự cố này sẽ bị chặn lại. Vì vậy, cố gắng giữ một giao dịch kinh doanh trong một phương thức dịch vụ được gọi là từ lớp web.

+0

grr đánh tôi với nó .... + 1 – hvgotcodes

+0

Tương tự như vậy, dagnabbit! –

+0

Tomasz luôn đánh tôi ... +1 – aweigold

0

Rõ ràng là lớp DAO. Bất kỳ thứ gì kết nối với lớp truy cập dữ liệu đều phải ở trong lớp DAO và (tốt nhất) được chú thích bằng @Repository và dịch vụ của bạn (được chú thích bằng @Service) sẽ có một xử lý đối với cá thể DAO.

Dịch vụ có thể gọi nhiều DAO nhưng không phải theo cách khác. DAOs phải là nguyên tử trong tự nhiên.

Nếu bạn đang bắt đầu giao dịch thì nó phải ở trong lớp dịch vụ theo ý kiến ​​của tôi, hỗ trợ tuyên bố trước của tôi mà tôi đề cập đến DAO phải là nguyên tử trong tự nhiên.

+0

nhưng nếu tôi bắt đầu giao dịch trong lớp DAO, tôi nhận được hai phiên mở ngoại lệ hoặc không có phiên ràng buộc ... becoz trong lớp dịch vụ nếu tôi gọi hai phương pháp hai phương pháp này đang sử dụng các phiên khác nhau .. sau đó làm thế nào để giải quyết điều này .. –

+1

Tại sao? Điều đó sẽ yêu cầu các giao dịch lồng nhau cho bất kỳ thứ gì đi qua nhiều DAO. –

+0

ghostrider tiêu cực, câu trả lời @tomasz là chính xác ... – hvgotcodes

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