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_: 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.
  • Odpowiedz
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.
  • Odpowiedz
@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
  • Odpowiedz
@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()
  • Odpowiedz
@juniordev: ehhh nie moge uwierzyc ze nie ogarnalem tego xD myslalem ze to jakis blad ide ze akurat w tamtej linii mi blad daje xD
dziekuje ()
  • Odpowiedz
@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)
  • Odpowiedz
@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
  • Odpowiedz