M-am impotmolit in legatura a doua entitati:
View
- entitate1
User
- entitate2
am creat tabela ViewUser
care contine un ViewId
, UserId
si Role
in tabela View, am o coloana UsersCount care de fapt e un select count(*) from ViewUsers where viewId = ?
de ce am nevoie de acel UsersCount in tabela Views? Pentru ca in pagina web, in lista de views vreau sa afisez coloana UsersCount si sa pot face sortare dupa ea. Daca as fi luat campul asta calculat din ViewUsers, ar fi trebuit ca atunci cand userul da click pe coloana respectiva din headerul tabelului, ar trebui ca sortarea sa fie calculata dintr-o tabela externa (celei Views) si m-as complica.
Astfel, cand voi adauga o linie noua in ViewUser, voi actualiza si coloana UsersCount din tabela Views.
Problema: dependinta circulara in servicii:
- pentru ca am ales sa pastrez
View
siViewUser
ca entitati diferite, cand adaug o linie noua inViewUser
voi avea nevoie sa actualizez siView
. Aveam deja injectatViewUsersService
inViewsService
pentru ca atunci cand sterg un view, am nevoie sa-i sterg toate dependintele. Astfel, inViewUsersService.add()
trebuie sa fac un get dinViewsService.getById()
si sa-l actualizez. Aici apare problema de dependinta circulara.
rezolvari?:
- daca era frontend, as fi scos codul intr-un serviciu comun si evitam asta.
- integrez
ViewUser
inView
(cum ar fi trebuit de la inceput, dar am incercat ca toate tabelele de legatura sa fie reprezentate prin entitati in api, pentru a nu aglomera clasele principale foarte mult); si pot pastra repourile diferite ViewsRepo si ViewUsersRepo (le injectez pe ambele in ViewsService) - elimin campul
UsersCount
din tabelaViews
si pentru fiecare rand dingetViewsList()
calculezUsersCount
, doar ca sunt nevoit sa renunt la sortarea din frontend (ori sa creez functie speciala care sa sorteze pe agregate = necesita timp)
multam
mai sunt dator cu un raspuns pe alt topic, incerc sa-mi fac putin timp