Wpis z mikrobloga

@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: 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 juz
@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_ 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.
@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
@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
@Bruno_: jestem na telefonie więc nie sprawdzę tego, ale wygląda na to, że serializacja Jacksona wykonuje się nie w transakcji.
Gdybyś zrobił DTO dla tego obiektu i przepisał z encji do niego wartości w transakcji to powinno działać.
Chociaż w tym wypadku najlepiej byłoby stworzyć query z joinem żeby uniknąć problemu n+1.
Kurla ten wykop... Ucięło mi
where u.id=?1

Ogólnie przesyłanie encji po całym systemie to trochę słaby design. Jak zmieni Ci się encja to od razu zmieni Ci się zwracany json a to może złamać jakiś kontrakt. Powinieneś oddzielić warstwę prezentacji od biznesu i persystencji.
@Bruno_: zbudowałem twój projekt i moje query działa.

Select p from Post p JOIN FETCH p.user u where u=?1


Tylko teraz będziesz mial problem z cykliczną zależnością:
Post bedzie mial usera->user będzie miał liste postów -> kazdy z postów bedzie mial usera itd..

Ale query działa i nie ma problemu z lazy loadingiem.
@Bruno_: nie masz juz problemy z tym query. masz problem z testem. odpal sobie debug w tym tescie i zobacz co tam dostajesz. Normalny http get request nie wywali Ci tego exceptiona.

Teraz exception leci z :

posts.toString()
@juniordev: w sumie dzialalo i bez tego, no ale i tak musialem zmienic na BeforeEach tam zeby testy byly od siebie niezalezne (bo tak to zmieniala sie np ilosc postow i musialaby byc okreslona kolejnosc tych testow, a tak to moze asynchronicznie kiedys bede je robil, chociaz nawet nie wiem czy junit wspiera takie cos)
@Przegrywek123: Może ja odpowiem. Ogólnie łatwiej ale
1. Wrzucanie @Autowired na pola klasy w konsekwencji prowadzi do tworzenia duzych, skomplikowanych obiektów z mnóstwem zależności
2. Jeśli masz jedyny konstruktor na klasie i nie jest to konstruktor domyślny, to znaczy, że nie jesteś w stanie utworzyć tej klasy bez tych zależności, a to znaczy, że ta klasa prawdopodobnie nie może istnieć bez tych zależności