Gdzie należy umieścić „@Transactional” Warstwę usług lub DAO


81

Po pierwsze, jest możliwe, że pytam o coś, o co wcześniej pytano i na które udzielono odpowiedzi, ale nie udało mi się uzyskać wyników wyszukiwania. Okej ogólnie (lub jak na razie zawsze :)) Adnotacje transakcyjne definiujemy na warstwie serwisowej typowym wiosennym hibernacją jest zwykle

Kontroler-> Menedżer-> Dao-> Orm.

Mam teraz sytuację, w której muszę wybrać między modelem domeny opartym na lokacji klienta. Powiedzmy, że klient A używa mojego modelu domeny, wszystko jest w porządku, ale wtedy inna lokacja klienta zapewni mi usługę sieci Web i nie będzie używać naszego modelu domeny.

Którą warstwę mam wymienić. Uważam, że to musi być DAO, który będzie pobierał mi dane z usługi sieciowej i odsyła je z powrotem. Tj. Dwie osobno napisane warstwy DAO i podłączane na podstawie scenariusza.

Teraz zdałem sobie sprawę, że robiliśmy ścisłe połączenie (jeśli jest coś takiego lub mówimy, że nie mamy luźnego połączenia), kiedy wprowadziliśmy @Transactionalwarstwę Service. Tak wiele mózgów nie może się mylić, czy też są (wątpię).

Pytanie brzmi więc „Gdzie” @Transactional„umieścić warstwę usług lub DAO?” i czy jest to warstwa usług w dół, którą powinienem wymienić.


6
To pytanie jest w rzeczywistości duplikatem sprawdzonych metod dotyczących adnotacji Spring @Transactional .
Pascal Thivent

Odpowiedzi:


81

Idealnie byłoby, gdyby warstwa usług ( menedżer ) reprezentowała logikę biznesową i dlatego powinna być opatrzona adnotacją @Transactional.

Warstwa usług może wywoływać różne DAO w celu wykonania operacji DB. Załóżmy, że mamy 3 operacje DAO w metodzie usługowej. Jeśli pierwsza operacja DAO nie powiodła się, pozostałe dwie mogą zostać pomyślnie zakończone, a stan bazy danych będzie niespójny. Warstwa usługi adnotacji może uchronić Cię przed takimi sytuacjami.


Dzięki za odpowiedź. Czy możesz podać rok, w którym odpowiedziałeś? Wierz lub nie wierz lub nie. Myślę, że mogłeś właśnie udowodnić istnienie wehikułu czasu. Dałem ci +1 w 2015 r.
Shahzeb

Nie zauważyłem roku, dopóki nie zapytałeś :)
Badal

60

Będziesz chciał, aby Twoje usługi były transakcyjne. Jeśli Twoje DAO są transakcyjne i dzwonisz do różnych DAO w każdej usłudze, będziesz mieć wiele transakcji, co nie jest tym, czego chcesz. Spraw, aby wywołania usługi były transakcyjne, a wszystkie wywołania DAO wewnątrz tych metod będą uczestniczyć w transakcjach dla metody.


6
nie mógł określić metody propagacji w swojej @Transactionadnotacji, tak że używana jest tylko 1 transakcja, tak jak jest ona tutaj
Fotis Paraskevopoulos

1
@FotisParaskevopoulos To będzie działać tylko wtedy, gdy ma @Transactionalon zarówno usługi i DAO. Wtedy dodatkowa adnotacja nie zaszkodzi, ale też nie pomoże.
William F. Jameson,

6

Zasugeruję umieszczenie @Transactional w metodach warstwy usług, ponieważ możemy mieć wiele implementacji DAO. Dzięki temu możemy sprawić, że nasze usługi będą miały charakter transakcyjny. odnosić się

Najlepszą praktyką jest użycie ogólnej usługi BasicService do oferowania typowych usług.

Usługa jest najlepszym miejscem do umieszczenia @Transactional, warstwa usług powinna zawierać szczegółowe opisy przypadków użycia dla interakcji użytkownika, które logicznie przejdą do transakcji. w ten sposób możemy zachować separację między kodem aplikacji internetowej a logiką biznesową.

Istnieje wiele aplikacji CRUD, które nie mają żadnej znaczącej logiki biznesowej, ponieważ posiadanie warstwy usług, która po prostu przekazuje dane między kontrolerami a obiektami dostępu do danych, nie jest przydatne. W takich przypadkach możemy umieścić adnotację transakcji na Dao.

Więc w praktyce możesz umieścić je w dowolnym miejscu, to zależy od Ciebie.

Mając wiele połączeń w swojej usłudze, potrzebujesz usługi @Transactional. różne wezwania do obsługi będą wykonywane w różnych transakcjach, jeśli uruchomisz usługę @Transactional.


0

Jest to osobisty wybór w oparciu o typy aplikacji, jeśli aplikacja jest podzielona na wiele modułów, a większość operacji opiera się na @CRUD, wtedy posiadanie adnotacji @transactional na poziomie usługi ma sens ... aplikacja typu silnika, taka jak harmonogramy, serwery zadań, @ etl aplikacje raportujące, w których nie ma sesji i koncepcji użytkownika, wtedy najodpowiedniejsza jest transakcja propagacyjna na poziomie kontekstu ... nie powinniśmy kończyć tworzenia transakcji w klastrze, umieszczając @transactional wszędzie, kończąc na transakcyjnych anty-wzorach ... w każdym razie dla transakcji pragmatycznej sterowanie JTA2 jest najbardziej odpowiednią odpowiedzią ... znowu to zależy od pogody, możesz go użyć w danych sytuacjach ...


0

Powinieneś użyć @Transactional w warstwie usług, jeśli chcesz zmienić model domeny dla klienta B, w którym musisz dostarczyć te same dane w innym modelu, możesz zmienić model domeny bez wpływu na warstwę DAO, zapewniając inną usługę lub tworząc interfejs i wdrażając interfejs w innym modelu iz tą samą usługą zapełniamy model oparty na kliencie. Decyzja ta jest podejmowana na podstawie wymagań biznesowych i zakresu projektu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.