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

Problem z relacjami

VPS Starter Arubacloud
0 głosów
102 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 (212,630 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 (269,120 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 (212,630 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ź 289 wizyt
0 głosów
1 odpowiedź 104 wizyt
pytanie zadane 17 lutego 2020 w Java przez Uwegi Początkujący (430 p.)
0 głosów
1 odpowiedź 347 wizyt
pytanie zadane 30 grudnia 2017 w Java przez przemko06 Początkujący (370 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...