“@Transactional” nên đặt Lớp dịch vụ hoặc DAO ở đâu


81

Thứ nhất, có thể tôi đang hỏi điều gì đó đã được hỏi và trả lời trước đó nhưng tôi không thể lấy lại kết quả tìm kiếm. Nói chung được rồi (hoặc luôn luôn cho đến nay :)) Chúng tôi xác định các chú thích giao dịch trên lớp dịch vụ thông thường của mùa xuân ngủ đông thường là

Controller-> Manager-> Dao-> Orm.

Bây giờ tôi có một tình huống mà tôi cần phải chọn giữa mô hình miền dựa trên trang web của khách hàng. Giả sử khách hàng A đang sử dụng mô hình miền của tôi, tất cả đều tốt nhưng sau đó một trang web khách hàng khác sẽ cung cấp cho tôi dịch vụ web và không sử dụng mô hình miền của chúng tôi.

Tôi nên thay thế lớp nào. Tôi tin rằng đó phải là DAO sẽ lấy cho tôi dữ liệu từ dịch vụ web và gửi nó trở lại. Hai lớp DAO được viết riêng biệt và được cắm vào dựa trên kịch bản.

Bây giờ tôi đã nhận ra rằng chúng tôi đã thực hiện khớp nối chặt chẽ (nếu có điều này hoặc nói không có khớp nối lỏng lẻo) khi chúng tôi đặt @Transactionalvào lớp Dịch vụ. Vì vậy, nhiều bộ não không thể sai hoặc là họ (tôi nghi ngờ điều đó).

Vì vậy, câu hỏi đặt ra là "Nên @Transactionalđặt Lớp Dịch vụ hay DAO ở đâu?" và nó có phải là lớp dịch vụ trở xuống mà tôi nên thay thế không.


6
Câu hỏi này thực sự là một bản sao của Phương pháp hay nhất về Spring @Transactional Annotation .
Pascal Thivent

Câu trả lời:


80

Lý tưởng nhất, lớp Dịch vụ ( Trình quản lý ) đại diện cho logic kinh doanh của bạn và do đó nó phải được chú thích bằng @Transactional.

Lớp dịch vụ có thể gọi các DAO khác nhau để thực hiện các hoạt động DB. Hãy giả sử một tình huống mà bạn có 3 hoạt động DAO trong một phương thức dịch vụ. Nếu thao tác DAO đầu tiên của bạn không thành công, hai thao tác khác có thể vẫn được thông qua và bạn sẽ có trạng thái DB không nhất quán. Lớp Dịch vụ chú thích có thể giúp bạn thoát khỏi những tình huống như vậy.


Cảm ơn vì đã trả lời. Bạn có thể vui lòng cho biết năm bạn đã trả lời? Tin hay không tôi nghĩ bạn có thể vừa chứng minh được sự tồn tại của cỗ máy thời gian. Đã
tặng

Tôi đã không để ý đến năm cho đến khi bạn hỏi :)
Badal

60

Bạn sẽ muốn các dịch vụ của mình được giao dịch. Nếu các DAO của bạn là giao dịch và bạn gọi các DAO khác nhau trong mỗi dịch vụ, thì bạn sẽ có nhiều giao dịch, điều này không như bạn muốn. Thực hiện giao dịch các cuộc gọi dịch vụ và tất cả các lệnh gọi DAO bên trong các phương thức đó sẽ tham gia vào các giao dịch cho phương thức.


6
anh ta không thể chỉ định một phương pháp Tuyên truyền trên @Transactionchú thích của mình , để chỉ có 1 giao dịch được sử dụng, vì nó được liệt kê ở đây
Fotis Paraskevopoulos

1
@FotisParaskevopoulos Điều đó sẽ chỉ hoạt động nếu anh ấy có @Transactionaltrên cả dịch vụ DAO. Sau đó, chú thích thêm sẽ không ảnh hưởng gì, nhưng cũng không giúp ích gì.
William F. Jameson

6

tôi sẽ đề xuất đặt @Transactional trong các phương thức lớp Dịch vụ vì chúng tôi có thể có nhiều triển khai DAO. bằng cách sử dụng điều này, chúng tôi có thể làm cho các dịch vụ của chúng tôi sẽ được giao dịch. tham khảo

thực tiễn tốt nhất là sử dụng A BasicService chung để cung cấp các dịch vụ thông thường.

Dịch vụ là nơi tốt nhất để đặt @Transactional, lớp dịch vụ phải giữ hành vi trường hợp sử dụng cấp chi tiết cho một tương tác người dùng sẽ diễn ra một cách hợp lý trong giao dịch. bằng cách này, chúng ta có thể duy trì sự tách biệt giữa mã ứng dụng web và logic nghiệp vụ.

Có rất nhiều ứng dụng CRUD không có bất kỳ logic nghiệp vụ quan trọng nào, vì chúng có một lớp dịch vụ chỉ chuyển nội dung giữa bộ điều khiển và các đối tượng truy cập dữ liệu là không hữu ích. Trong những trường hợp này, chúng ta có thể đặt chú thích giao dịch trên Dao.

Vì vậy, trong thực tế, bạn có thể đặt chúng ở một trong hai nơi, tùy thuộc vào bạn.

Bằng cách có nhiều cuộc gọi trong dịch vụ của bạn, bạn cần có @Transactional trong dịch vụ. các lệnh gọi dịch vụ khác nhau sẽ thực hiện trong các giao dịch khác nhau nếu bạn đưa @Transactional vào dịch vụ.


0

Đó là một lựa chọn cá nhân dựa trên các loại ứng dụng, nếu ứng dụng được phân lớp trên nhiều mô-đun và phần lớn hoạt động dựa trên @CRUD, thì việc có chú thích @transactional ở cấp dịch vụ sẽ tạo ra nhiều ứng dụng hơn .. ứng dụng loại động cơ như bộ lập lịch, máy chủ công việc, @ etl ứng dụng báo cáo, trong đó các phiên và khái niệm người dùng không tồn tại, khi đó giao dịch truyền bá ở cấp ngữ cảnh là phù hợp nhất ... chúng ta không nên kết thúc việc tạo các giao dịch clusterd bằng cách đặt @transactional vào mọi nơi kết thúc giao dịch chống người dùng ... dù sao cho giao dịch thực dụng điều khiển JTA2 là câu trả lời phù hợp nhất ... một lần nữa, nó phụ thuộc vào thời tiết, bạn có thể sử dụng nó trong một số tình huống nhất định ...


0

Bạn nên sử dụng @Transactional ở lớp dịch vụ, nếu bạn muốn thay đổi mô hình miền cho ứng dụng khách B trong đó bạn phải cung cấp cùng một dữ liệu trong một mô hình khác, bạn có thể thay đổi mô hình miền mà không ảnh hưởng đến lớp DAO bằng cách cung cấp một dịch vụ khác hoặc bằng cách tạo một giao diện và triển khai giao diện theo mô hình khác nhau và với cùng một dịch vụ sẽ điền vào mô hình dựa trên khách hàng. Quyết định này dựa trên yêu cầu kinh doanh và phạm vi của dự án.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.