Tworzę sobie prosty sklep online. Zastanawiam się czy prawidłowym podejściem będzie wdrożenie klas DTO i ograniczyć używania encji bazodanowych w kontrolerze? np. przy rejestracji Użyć klasę UserDto.. Jak jest prawidłowe podejście do mapowanie przy relacji many to many ?
Tak, będzie to prawidłowe podejście, bo klasa, która ma służyc za model/widok do komunikacji ze światem zewnętrznym, a encja to różne odpowiedzialności i powody do zmian. Tak samo przy rejestracji czy ogólnie przyjmowania danych ze światem zewnętrznym - DTO. Tym bardziej, że podczas rejestracji jeżeli kontroler będzie przyjmował dane to pewnie część pól bedzie nullem, które w encji nullami być nie powinny - zostaną ustawione dopiero za kontrolerem. Można wtedy zrobić np. NewUserDto i po samej nazwie widać, do czego ta klasa bedzie wykorzystwana.
Ja stworzyłbym 3 wersje klasy:
- DTO z surowymi typami (String, int, itd) do RESTa
- encje bazodanowe do mapowania 1:1 z tabelami w bazie
- klasy biznesowe mocno otypowane, a więc np zamiast "String accountName;" lepiej wrzucić "AccountName accountName;"
DAO zamienia encje bazodanowe na klasy biznesowe i vice versa. Podobnie do DTO są osobne konwertery tak by logika biznesowa nie musiała nic wiedzieć o DTO.
Przy czym nie używałem nigdy Hibernate'a (czy czegokolwiek tego typu) i nie zamierzam. Do obsługi bazy wykorzystuję biblioteki typu https://www.jooq.org/ ale Scalowe (konkretnie to Slick: http://slick.lightbend.com/