• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z relacjami

Aruba Cloud - Virtual Private Server VPS
0 głosów
158 wizyt
pytanie zadane 20 października 2022 w Java przez Unit Nowicjusz (150 p.)

Cześć wszystkim,

Mam pewien problem który nie do końca wiem jak mógłbym rozwiązać, a mianowicie posiadam 3 encje: Student, Przedmiot, Ocena reszta jest nie ważna bo tylko z tymi mam problem.

Moim celem jest wyciągnięcie dla jednego studenta (w zależności od requesta) albo listę wszystkich przedmiotów wraz z wszystkimi ocenami, albo listę ocen dla konkretnego przedmiotu.

Jeśli moje myślenie jest w ogóle błędne proszę o nakierowanie, nie oczekuje tutaj gotowca.

Przechodząc do sedna: Wymyśliłem to w taki sposób, że moja tabela (łącząca) będzie przechowywała po prostu idStudenta, idPrzedmiotu, idOceny dzięki czemu mogę łatwo zapytaniem sobie wyciągnąć potrzebne dane.

Mój problem polega na tym, że nie do końca wiem jak mogę w hibernate zmapować takie 3 tabele, aktualnie po przekopaniu internetu trafiłem na takie rozwiązanie:

I ogólnie jest wszystko spoko, do czasu kiedy potrzebuję to zmapować na jakiś sensowny DTO dla response, ponieważ w tak naprawdę potrzebuje (mniej więcej) coś takiego:

"idStudent": ...
"firstName": ...
"lastName": ...
"subjects" {
   "subjectId": ...
   "subjectName": ...
   "ratings"{
        "ratingId": ...
        "rating": 5
        "weight" : 2
}
}

Nie ukrywam, że troszkę mnie pokonało to wyzwanie dlatego zwracam się tutaj z prośbą o nakierowanie w jaki sposób można to ugryźć :/ 

Tutaj jeszcze załączę tą tabelę, może to wina mojego modelowania bazy danych ? sam już nie wiem.

 

Z góry dziękuję za jakąkolwiek wskazówkę :) 

1 odpowiedź

+3 głosów
odpowiedź 20 października 2022 przez Ehlert Ekspert (214,940 p.)
wybrane 21 października 2022 przez Unit
 
Najlepsza

Ale ocena jest wystawiana w określonym kontekście. Dlaczego nie zrobisz wyciągania wszystkich ocen, gdzie id studenta = x oraz od razu przedmiotu dla tych ocen. Jeden join, orm nie dyszy, wszystkie dane są.

A to czy uczeń jest przypisany do jakiegoś przedmiotu imo nie powinno wynikać z ocen cheeky

komentarz 21 października 2022 przez Wiciorny Ekspert (280,450 p.)

Jeden join, orm nie dyszy, wszystkie dane są.


Hibernate nie jest bystry i nie-zoptymalizowany jeden join zrobi dodatkowe N joinów/zaytań dla pozostałych, więc to trzeba będzie w zapytaniu po odpowiednią wartość zamienić na JoinFetch lub Batch Size.

Niestety jesli bedzie korzystal z JPA i typowych metod w ramach implementacji tego ORM, to Fetch.Eager nie pomoże, a pobranie wszystkich elementów i tak zostanie pobrane Lazy bo domyślnie zostaje nadpisane przez metody orm.

komentarz 21 października 2022 przez Unit Nowicjusz (150 p.)

@Ehlert, ogólnie masz racje, mogę sobie puścić takowe zapytanie które zwróci mi listę List<RatingSubjectStudent> tylko jak to wtedy zmapowac ? chyba ze w ogóle nie zrozumiałem tego co napisałeś

1
komentarz 21 października 2022 przez Ehlert Ekspert (214,940 p.)
Ale wszystkie dane masz wyciągnięte z bazy. Jak robisz takie rzeczy to zakładam, że zmienne, obiekty i pętle ogarniasz. W czym jest problem ze zbudowaniem zwrotki?
komentarz 21 października 2022 przez Unit Nowicjusz (150 p.)
edycja 21 października 2022 przez Unit

Ajaj, mam wrazenie ze gdzies po prostu popelnilem blad przy modelowaniu bazy, bo jak widzisz pobiore sobie ta liste, z wyciagnieciem studenta nie ma problemu, ale z tej encji nie moge sobie wyciagnac getSubject.getRatings() ktora zwroci mi liste ocen z tego danego przedmiotu, wszystkie te encje nic o sobie nie wiedza i tu mam taka sciane z tym.

Tak naprawde mniej wiecej to wyglada tak:
 

Student Przedmiot Ocena
Michał Przyroda 1
Michał Przyroda 3
Michał Przyroda 4
Michał Matematyka 5

 

I teraz musze: Usunac te duplikaty (2x przyroda) przy czym zachowac wszystkie oceny do tego przedmiotu, zmapowac to na jakis obiekt ktory w sobie ma wlasnie dane o przedmiocie (+ liste ocen z tego przedmiotu) i tu mam taki problem z tym :D

Wiadomo moglbym to zmapowac, hashSet usuniecie duplikatow z przedmiotow itd. ale wydaje mi sie ze zrobi sie z tego ladny smietnik.

No nic, bede nad tym myslal, na pewno da sie to zrobic racjonalniej :D

 

Podobne pytania

+1 głos
1 odpowiedź 564 wizyt
0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 17 lutego 2020 w Java przez Uwegi Początkujący (430 p.)
0 głosów
1 odpowiedź 607 wizyt
pytanie zadane 30 grudnia 2017 w Java przez przemko06 Początkujący (370 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...