z encji order dostaje wszystkie orderItem, a potem dla orderItem dostaje wszystkie order

0

Witam, z pewnością to błacha sprawa ale mam taki problem i nie bardzo wiem jak to ugryść pobierając dane z bazy dostaje "order " i wszystkie " orderItem" ale potem jeszcze raz
dostaje dla tego "OrderItem" wszystkie order i tak w kólko i jakby dla jednego zapytania dostaje nieskonczenie wiele linijek a to tylko fragment.

 {
        "id": 53,
        "totalQuantity": 2,
        "totalPrice": 40.00,
        "status": null,
        "dateCreated": "2021-11-11T16:54:58.000+00:00",
        "lastUpdated": null,
        "orderItems": [
            {
                "id": 31,
                "imageUrl": null,
                "unitPrice": 20.00,
                "quantity": 2,
                "productId": 8,
                "order": {
                    "id": 53,
                    "totalQuantity": 2,
                    "totalPrice": 40.00,
                    "status": null,
                    "dateCreated": "2021-11-11T16:54:58.000+00:00",
                    "lastUpdated": null,
                    "orderItems": [
                        {
                            "id": 31,
                            "imageUrl": null,
                            "unitPrice": 20.00,
                            "quantity": 2,
                            "productId": 8,
                            "order": {
                                "id": 53,
                                "totalQuantity": 2,
                                "totalPrice": 40.00,
                                "status": null,
                                "dateCreated": "2021-11-11T16:54:58.000+00:00",
                                "lastUpdated": null,
                                "orderItems": [



@Entity
@Table(name="order_item")
@Getter
@Setter
@Transactional
public class OrderItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name="image_url")
    private String imageUrl;

    @Column(name="unit_price")
    private BigDecimal unitPrice;

    @Column(name="quantity")
    private int quantity;

    @Column(name="product_id")
    private Long productId;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "order_id")
    private Order order;

}


i

@Entity
@Table(name="orders")
@Getter
@Setter
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name="total_quantity")
    private int totalQuantity;

    @Column(name="total_price")
    private BigDecimal totalPrice;

    @Column(name="status")
    private String status;

    @Column(name="date_created")
    @CreationTimestamp
    private Date dateCreated;

    @Column(name="last_updated")
    @UpdateTimestamp
    private Date lastUpdated;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
    private Set<OrderItem> orderItems = new HashSet<>();

    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "shipping_address_id", referencedColumnName = "id")
    private Address shippingAddress;


    public void add(OrderItem item) {

        if (item != null) {
            if (orderItems == null) {
                orderItems = new HashSet<>();
            }

            orderItems.add(item);
            item.setOrder(this);
        }
    }
}

z góry dziekuje za pomoc, pozdrawiam

4

Zrób sobie jakieś DTO i je zwracaj.

5

Encja na twarz i pchasz xD
Nie zwraca się encji JPA bezposrednio do frontendu, korzystaj z DTOsów.

    private Date dateCreated;

Serio? 2021 rok, Java 8 już ma 7 lat a Ty nadal z java.util.Date korzystasz? o_O

    @Column(name="status")
    private String status;

A te column to po co? Bo tutaj żadnego sensu nie ma, i tak Hajbernejte to zmapuje.
Objerzyj

5

Co to daje?

@Transactional
public class OrderItem

Wstawiasz adnotacje i kopiujesz jakieś rozwiązania bez zrozumienia, co chwile będziesz potykał się o nowe problemy.

Odnośnie oryginalnego pytania - zakładam, że z kontrolera zwracasz encje i masz dwustronną relacje (która nie jest zalecana btw, ale to inny temat), wiec podczas generowania jsona ta relacja jest przechodzona „w kółko”. Albo zlikwidujesz dwustronna relacje (np. z OrderItem usuniesz referencje do Order) albo zwrócisz obiekt pośredni, który nie będzie miał tej relacji w 2 strony.

2

aaaaaaaa

  1. Wincyj adnotacji, na pewno pomoże! Szczególnie ten @Transactional
  2. Problem polega na tym że nie rozumiesz co robisz tylko losowo próbujesz odpalić jakaś magie. Rozumiesz w jaki sposób jackson robi JSONa z obiektu? Bierze twój order i zamienia wszystkie pola na jsona. Ale jedno z pól twojego orderu to lista OrderItemów, więc zacznie zamieniać te itemy na jsona, tylko że każdy Item ma znowu referencje na Order...
  3. Zacznij od tego zeby NIGDZIE nie operować tymi klasami Entity. Jeśli potrzebujesz robić jakąś logikę, to tworzysz obiekt domenowy na bazie tego co przyszło z bazy. Jak chcesz coś wysłać na front, to budujesz DTO specjalnie pod ten endpoint.
3

dostaje dla tego "OrderItem" wszystkie order i tak w kólko i jakby dla jednego zapytania dostaje nieskonczenie wiele linijek a to tylko fragment.

Ile trwa ta operacja? Bo jak trwa to to skończenie wiele czasu i dostajesz nieskończenie wiele rezultatów - to gratuluję bazy danych i sprzętu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1