Wpis z mikrobloga

#spring #java Jak poprawnie napisać własną metodę toString() ? odnosząc się do mojego pytania na stacku i odpowiedzi do niego , próbowałem coś w stylu " return this.getName()+"," this.Kolejnawartość" .
W skrócie, mam rekurencję w kodzie, toString klasy Animals nie może wyświetlić toString Tags i tak w kółko. Jakieś sugestie ?
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@lukaszwasyl: To nie problem z toStringiem czy hashCodem, tylko problem z mapowaniem encji jakie masz. Nie tworzysz DTO i zwracasz sobie na front encję która ma bezpośrednio inną encję, która ma twoją encję. Infinite recursive loop.
3 wyjścia.
Jeśli wystawiałbyś restowe API to możesz użyć adnotacji @JsonManagedReference i @JsonBackReference, błąd nie wystąpi.
Możesz stworzyć poprawny model i używać DTO.
Możesz stworzyć relację unidirectional, w tym momencie ci
  • Odpowiedz
@lukaszwasyl: Pomyśl co robisz.
masz zwierzę, które ma Tag. I co ma ten tag? To samo zwierze. I co ma to zwierze? Ten tag.
Tam nie ma krasnoludków, które ci się domyślą co ty chcesz zrobić, będzie mapować dopóki nie spotka końca albo nie zapełni stacka
  • Odpowiedz
@Przegrywek123: Dzięki, najbardziej rzeczowa odpowiedź imo. Rozumiem. Bardziej chciałem stworzyć Ofertę która ma dany tag. Ale Zwierze również ma swój tag ( z 7-miu dostępnych ). A do jednego tagu jest przypisanych wiele zwierząt. I przy dodawaniu oferty wybieram i tag i zwierzę które ten tag też ma - i rozumiem że tu jest błąd.
Nie mam restowego API więc opcja1 odpada.
2. Poczytam, spróbuje ewentualnie.
3. Tylko w relacji
  • Odpowiedz
@lukaszwasyl: btw co do @ManyToOne(fetch = FetchType.EAGER) i @OneToOne(fetch = FetchType.EAGER), czy przypadkiem nie jest fetch eager domyślnie? Czemu go tu ustawiasz ( ͡° ͜ʖ ͡°). No i tak jak pisałem i przegrywek używaj dto, nawej jak masz relacje w encjach tag-zwierze zwierze-tag to w dto moze byc tag-zwierze po prostu zwierze nie będzie wiedziało o tagu.
  • Odpowiedz
@lukaszwasyl: dobra, jak już wszedłem na staka to:
adnotacja @Data zapewnia AllArgsContructor więc nie musisz jej dawać
@Builder raczej się nie używa jak zapewniasz konstruktor dla pól, jak chcesz miec builder to zostawiłbym tylko @NoArgsConstructor i dał Getter&Setter
Nie musisz pisać nazw kolumn i nazw tablic jeśli są takie same jak nazwy pól, ta adnotacja nadpisuje nazwę domyślną. Czyli nadpisujesz "contact" nazwą "contact"
Jak używasz kolekcji, to inicjalizuj je sobie defaultowo, czyli private Set animals = new HashSet<>();
Nie używaj EAGER, nadpisz to jako LAZY, i nie używaj repozytoriów w kontrolerach, tylko stwórz sobie serwis, adnotacją @Service. Tam wykonuj wszystkie operacje I/O na bazie. Poczytaj o transakcjach, do tego masz @Transactional. (bodaj 5.8 w dokumentacji Data JPA) Wtedy nie wyrzuci ci infinite recursive, ponieważ gdy otworzysz transakcję i pobierzesz Animal, to w tym momencie on nie ma Tag. To istnieje jako
  • Odpowiedz
@lukaszwasyl: nie czytalem tego co napisales bo wychodze z domu i musze sie bardzi soieszyc, ja mialem kiedy taki problem ze toString wywalal mi stackoverflow bo np user mial w sobie posty a post mial usera i robila sie petla, sprawdz czy to nie jest problem np robiac wlasna metode toString, mam nadzieje ze pomoze
  • Odpowiedz