@GetMapping, используемый для извлечения элемента, дает ответ бесконечного l oop объекта Foreignkey - PullRequest
1 голос
/ 16 апреля 2020

Я новичок в весенней загрузке, и я не могу найти решение для этого в течение дня.

@ GetMapping, используемый для извлечения элемента, дает ответ бесконечного l oop объекта Foreignkey "пользователь".

почему я получаю этот бесконечный l oop?

как это исправить?

пользовательский объект в бесконечном l oop (проблема)

user object in infinite loop(the problem)

результат, который я хочу

result that i want

элемент сущности

@Entity
public class Item{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long ItemId;
    @ManyToOne
    @JoinColumn(name = "owner_id")
    private User user;
    private String ItemName;
    // @Column(columnDefinition="text")
    private String Description;
    private double Price;
    private int AvailableQuantity;
    private double shippingWeight;
    // @Transient
    // private MultipartFile Picture;
    @Enumerated(value = EnumType.STRING)
    private Category category;
    @OneToMany(mappedBy = "item")
    @JsonIgnore
    private List<CartItem> CartItemList;
}

элемент сущности

@Entity
@Table(name = "Utilisateur")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idU;
    private String username;
    private String password;
    private String firstname;
    private String lastname;
    private String gender;
    private Long phone;
    private String adress;
    @Temporal(TemporalType.DATE)
    private Date dateofbirth;
    private int rating;
    private String email;
    public Role role;
    private Integer status;
    @OneToMany(mappedBy = "user")
    private List<Item> ItemList;

}

элемент службы

@Service
public class ItemService implements ItemServiceInterface{
    @Autowired
    ItemRepository itemrepository;

    public Optional<Item> getItemById(long id){
        return itemrepository.findById(id);
    }
}

элемент управления

@RestController
public class ItemControl {
    @Autowired
    ItemServiceInterface itemservice;

    @GetMapping("/getitem/{id}")
    public Optional<Item> getitembyid(@PathVariable Long id) {
        return itemservice.getItemById(id);
    }
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Вы можете использовать комбинацию @JsonManagedReference и @JsonBackReference, чтобы отговорить Джексона от бесконечной сериализации.

@Entity
@Table(name = "Utilisateur")
public class User {

    // omitted

    @JsonManagedReference
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Item> ItemList;
}
@Entity
public class Item{

    // omitted

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner_id")
    private User user;
}

Более подробную информацию можно найти здесь https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

0 голосов
/ 16 апреля 2020

Вы можете использовать ленивую загрузку, чтобы сократить зависимость l oop между пользователем и элементом. Однако следующий подход может потенциально повлиять на другие части ваших проектов, поскольку другие коды могут использовать сущность с предположением, что список элементов в пользовательской сущности уже готов к извлечению.

Лучший способ - не возвращать объект сущности напрямую. на ответ REST. Вы можете определить модель данных для ответа остальных и преобразовать сущность в эту модель в своем классе обслуживания. Таким образом, вы можете полностью контролировать, что возвращать, а не куда.

Другой подход, если вы все еще хотите использовать объект в качестве ответа: https://www.baeldung.com/spring-data-jpa-named-entity-graphs. Таким образом, вы можете определить, когда использовать ленивую загрузку для каждого указанного c запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...