Wpis z mikrobloga

#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)
  • 43
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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)
  • Odpowiedz
@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
  • Odpowiedz
@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)
  • Odpowiedz
@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.
  • Odpowiedz
@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
  • Odpowiedz
@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
  • Odpowiedz