Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

One To many - Lista com itens

Boa tarde professor!

Estou desenvolvendo uma API de listas e uma lista pode ter vários itens nela. O que gostaria era que ao consultar uma lista por id wishlist/{id} eu pudesse ter a saída:

{
  "id": 1,
  "item": [
        {
          "cloth": "string",
          "color": "string",
          "description": "string",
          "id": 0,
          "image": "string",
          "location": "string",
          "name": "string",
          "price": 0
        }
    ],
  "userName": "Fulano"
}

Poderia me dar uma luz de o que fazer? Pois atualmente não está retornando o esperado, pois além de não aparecer meus itens na saída, não está sendo associado lista id com item id. Eles estão soltos mesmo eu colocando OneToMany pra lista e OneToOne pra cada item.

@Entity
public class Wishlist {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany
    private List<Item> item;

    @OneToOne
    private User user;

    public Wishlist() {

    }

    public Wishlist (User user) {
        this.user = user;
    }
@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    private String image;
    private String cloth;
    private String color;
    private String location;
    private Double price;
    @OneToOne
    private Wishlist wishlist;

    public Item() {
    }

    public Item(String name, String description, String image, String cloth, String color, String location,
            Double price, Wishlist wishlist) {
        this.name = name;
        this.description = description;
        this.image = image;
        this.cloth = cloth;
        this.color = color;
        this.location = location;
        this.price = price;
        this.wishlist = wishlist;
    }
3 respostas

Eu modifiquei algumas linhas e agora gostaria de saber como faço para não vir o Wishlist que esta dentro do item? Pois está vindo infinitamente na consulta de detalhes da lista os itens e a lista com todos os itens novamente.

{
  "id": 1,
  "item": [
    {
      "id": 1,
      "name": "Item teste",
      "description": null,
      "image": null,
      "cloth": null,
      "color": null,
      "location": "google.com",
      "price": 10.0,
      "wishlist": {
        "id": 1,
        "item": [
          {
            "id": 1,
            "name": "Item teste",
            "description": null,
            "image": null,
            "cloth": null,
            "color": null,
            "location": "google.com",
            "price": 10.0,
            "wishlist": {
              "id": 1,
              "item": [
                {
                  "id": 1,
                  "name": "Item teste",
                  "description": null,
                  "image": null,
                  "cloth": null,
                  "color": null,
                  "location": "google.com",
                  "price": 10.0,
                  "wishlist": {
                    "id": 1,
                    "item": [
                      {
                        "id": 1,
                        "name": "Item teste",
                        "description": null,

...
solução!

Oi Ana,

Parece que seu mapeamento está incorreto. Se de um lado é @OneToMany do outro lado deve ser ManyToOne e não OneToOne:

@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    @ManyToOne
    private Wishlist wishlist;

    //outros atributos...
}
@Entity
public class Wishlist {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "wishlist")
    private List<Item> item;

    //outros atributos...

E o ideal seria você criar um DTO representando apenas os dados que quer devolver, para evitar o problema de loop infinito por conta do mapeamento bidirecional entre Wishlist e Item. Algo como:

public class WishlistDTO {
    private Long id;
    private String userName;
    private List<ItemDTO> item;

    public WishlistDTO(Wishlist wishlist) {
        this.id = wishlist.getId();
        this.userName = wishlist.getUser().getName();
        this.item = wishlist.getItem().map(ItemDTO::new).collect(Collectors.toList());
    }

    //getters
}
public class ItemDTO {
    private String cloth;
    private String color;
    //...

    public ItemDTO(Item item) {
        this.cloth = item.getCloth();
        this.color = item.getColor();
        //...
    }

    //getters

    //getters
}

Bons estudos!

Oi professor, obrigada pela dica.

Resolvi esse problema com @JsonIgnore em cima do objeto Wishlist, assim consigo capturar tudo menos o objeto que não preciso.