2017-03-22 104 views
6

zastanawiałem się, jak to anomalia należy obchodzić się:transakcja Boundary i DTO konwersja z JPA

  1. DTO powinny być przekształcone w kontrolerze, warstwa usługa nie trzeba o nich wiedzieć.
  2. Granice transakcji są definiowane przez warstwę usługi.

Ale jak można uniknąć wyjątku Wazy Lazy? Konwersja DTO może wymagać danych Lazy Fetched, ale nie może tego zrobić, ponieważ transakcja była obsługiwana przez warstwę usługi.

Są sposoby, które mogę wymyślić, ale wszystkie z nich są brzydkie. Umieszczenie konwersji DTO w warstwie serwisowej wydaje mi się teraz najlepsze.

Odpowiedz

5

Tak, zdecydowanie lepiej jest manipulować DTO w warstwie usługi. Jest to szczególnie ważne w przypadku aktualizowania encji zmianami zawartymi w DTO, ponieważ w przeciwnym razie należałoby pobrać i zaktualizować odłączone jednostki, przekazać je do usługi, ponownie połączyć w kontekście utrwalania itp.

"DTO powinny zostać przekonwertowane w kontrolerze warstwa usługowa nie musi o nich wiedzieć. "

Zamiast tego, powiedziałbym, że lepszą zasadą jest to, że kontrolerzy nie muszą wiedzieć o jednostkach. Ale możesz użyć oddzielnych obiektów zamiast DTO dla prostych przypadków, aby uniknąć tworzenia wielu małych klas DTO, chociaż osobiście zawsze używam DTO tylko po to, aby być konsekwentnym i aby ułatwić późniejsze zmiany.

2

Podniesiony "LazyInitializationException" jest po prostu sygnałem, że niektóre części danych nie zostały załadowane, więc najlepszym rozwiązaniem będzie wykonanie wielu połączeń od metody kontrolera do poziomu usługi i pobranie wszystkich wymaganych pól dla DTO.

Mniej eleganckie opcje:

  1. jego możliwych do wykrycia obszarów, które nie zostały załadowane za pomocą metody „org.hibernate.Hibernate.isInitialized” i pominąć je podczas DTO budować, zobaczyć tutaj pełną próbkę: How to test whether lazy loaded JPA collection is initialized?

  2. Można oznaczyć metodę kontrolera jako transakcyjną, po sesji zostanie uruchomiona sesja hibernacji, a więc będzie działało leniwy ładunek.