Bruno_
#brunouczysieprogramowac #java #spring #programowanie

Takie query działa (ale wywala blad ze nie moze zaladowac danych bo fetchtype.Lazy)

Select u.body from Post u where u.user = ?1


Natomiast przy tym wywala blad ze nie moze sparsowac query:

Select u.body from Post u join fetch u.user where u.user = ?1


Jakie bedzie poprawne query? Chce wydostac Post.body z tabeli body danego usera (probowalem obiektem user i user_id filtrowac)
  • Najlepsze
  • Wszystkie komentarze
S.....s
S.....s
@Bruno_: nie rozumiem w takim razie co ty chcesz zrobić
S.....s
S.....s
wywala blad ze nie moze zaladowac danych bo fetchtype.Lazy

@Bruno_: pobrać w tej samej sesji
Bruno_
Bruno_ Autor
0
@SuppressWarnings: to nie wchodzi w gre, nie bede ladowal 200 postow usera z bazy danych tylko po to zeby dostac np jego email
Bruno_
Bruno_ Autor
0
@Bruno_: w sumie jest opcja zeby pobrac usera z bazy danych, potem z obiektu odczytac jego id i zapytac repo o posty z danym id, ale to bedzie chyba slabe wydajnosciowo (bo 2 zapytania bazy danych zamiast jednego)
juniordev
juniordev
@Bruno_: a w transakcji to robisz?
Bruno_
Bruno_ Autor
0
@juniordev: a co to? ( ͡° ͜ʖ ͡°)

Bruno_
Bruno_ Autor
0
@juniordev: kurde zle napisalem we wpisie i juz nie mam opcji zeby zedytowac, wiec napisze jeszcze raz

Mam dwie encje: User i Post. W encji Post mam relacje ManyToOne i joincolumn z userem w postaci jego id (kolumna user_id). FetchType.Lazy (czemu? patrz drugi komentarz od gory), czyli jak wczytuje z bazy danych usera i chce odwolac sie do jego postow to wywala blad bo polaczenie z baza danych jakby jest
juniordev
juniordev
@Bruno_: kurła usunąłem niechcący. Ogólnie wyżej pytałem co dokładnie chcesz osiągnąć tym zapytaniem?
Bruno_
Bruno_ Autor
0
@juniordev: @SuppressWarnings: eh w sumie to niewazne, usuwam zaraz xD i tak musze wczytac usera i tak (╯︵╰,)
juniordev
juniordev
@Bruno_: Musisz to poprostu wykonać w transakcji. Oznacz swoje repo albo metode anntoacją @Transactional i będzie gites
juniordev
juniordev
@Bruno_: zajrzałem jeszcze w twoje repo i widzę, że posty w użytkowniku trzymasz w liście. Zastanów się czy rzeczywiście potrzebujesz listy i doczytaj o konsekwencjach używania list w encjach w JPA(a dokladniej Hibernate)
Bruno_
Bruno_ Autor
0
@juniordev: a jak to zrobic bez listy? transactional nic nie dalo i nie widze w sumie powodu zeby cos dalo
juniordev
juniordev
@Bruno_ Uczysz się więc chcę cię tylko nakierować. Można użyć innej kolekcji.
Jeśli wykonujesz operacje na leniwie ładowanych zależnościach to hibernate je podciągnie w locie. Powinno pomóc chyba, że wychodzisz z transakcji i tam próbujesz pobrać tego usera.
Bruno_
Bruno_ Autor
0
@juniordev: w przypadku innej kolekcji (chodzilo ci o set?) problem jest ten sam:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: pl.karolcz.springforum.user.User.posts, could not initialize proxy - no Session
juniordev
juniordev
@Bruno_: set nie rozwiąże tego problemu. Chodziło mi o inne konsekwencje używania listy. Wrzuć swoją kod na repo i wtedy zobaczymy, ok?
Bruno_
Bruno_ Autor
0
@juniordev: ja rozumiem w czym jest problem, w teorii wiem jak go rozwiazac ale rozwiazania ze stacka nie przynosza pozadanego efektu - nie wiem czym to jest spowodowane
juniordev
juniordev
@Bruno_: dlatego pokaż kod to nie będziemy zgadywać
Bruno_
Bruno_ Autor
0
@juniordev: duzo sie w sumie nie zmienilo, jest to wersja robocza, dlatego moze byc w miejscach w ktorych cos zmienialem syf
https://github.com/Karolcz125/spring-forum/tree/dev
juniordev
juniordev
@Bruno_: jeśli to metoda findAllByUser z PostServicu rzuca wyjątkiem to ja oznacz jako transakcyjna a nie metodę w repozytorium. Tak jak pisałem wyżej, to metoda w której próbujesz wydobyć leniwie ładowane pole musi być wykonana w transakcji