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

ManyToMany Inserindo uma Categoria no Produto

Ao inserir um Produto gostaria de cria-lo com uma categoria. No caso, Tanto entidade Categoria e Produto estão mapeados em ManyToMany. O problema que está dando erro, não estou conseguindo fazer a inserção de forma correta =/.

Classe Produto

@Entity
@Table(name = "tb_produto")
public class Produto implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String descricao;
    private Double preco;
    private String imgUrl;

    @ManyToMany
    @JoinTable(name = "tb_produto_categoria", joinColumns = @JoinColumn(name = "produto_id"), inverseJoinColumns = @JoinColumn(name = "categoria_id"))
    private Set<Categoria> categorias = new HashSet<>(); 

    @OneToMany (mappedBy = "id.produto" )
    private Set<PedidoItem> itens = new HashSet<>();

    public Produto() {

    }


    public Produto(Long id, String nome, String descricao, Double preco, String imgUrl, Set<Categoria> categorias,
            Set<PedidoItem> itens) {
        super();
        this.id = id;
        this.nome = nome;
        this.descricao = descricao;
        this.preco = preco;
        this.imgUrl = imgUrl;
        this.categorias = categorias;
        this.itens = itens;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Double getPreco() {
        return preco;
    }

    public void setPreco(Double preco) {
        this.preco = preco;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public Set<Categoria> getCategorias() {
        return categorias;
    }

    @JsonIgnore
    public Set <Pedido> getPedidos(){
        Set<Pedido> set = new HashSet<>();
        for (PedidoItem x: itens ) {
            set.add(x.getPedido());
        }
        return set;

    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Produto other = (Produto) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
}

Classe ProdutoDto

public class ProdutoDto {
    private Long id;
    private String nome;
    private String descricao;
    private String imgUrl;
    private Double preco;
    private Set<Categoria> categorias = new HashSet<>();


    public ProdutoDto() { 

    }

    public ProdutoDto(Produto produto) {
        this.id = produto.getId();
        this.nome = produto.getNome();
        this.descricao = produto.getDescricao();
        this.preco = produto.getPreco();
        this.imgUrl = produto.getImgUrl();
        this.categorias = produto.getCategorias(); 

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Double getPreco() {
        return preco;
    }

    public void setPreco(Double preco) {
        this.preco = preco;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public Set<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(Set<Categoria> categorias) {
        this.categorias = categorias;
    }
}

Produto Service


@Service
public class ProdutoService {

    @Autowired
    private ProdutoRepository rep;
    @Autowired
    private CategoriaService categoriaService;

    public List<ProdutoDetalheDto> findAll(){

        return rep.findAll().stream().map(ProdutoDetalheDto::new).collect(Collectors.toList());
    }

    public ProdutoDto findById(Long id) {

        return new ProdutoDto(rep.findById(id).get());

    }

public ProdutoDto inserir(ProdutoDto form, Long id) {

        CategoriaDto categoria = new CategoriaDto();
        categoria = categoriaService.findById(id);

        Produto produto = new Produto (null,form.getNome(),form.getDescricao(), form.getPreco(),form.getImgUrl(),form.getCategorias().add(categoria),null);

        return new ProdutoDto(rep.save(produto)); 
    }
3 respostas

Classe Categoria

@Entity
@Table (name = "tb_categoria")
public class Categoria implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue (strategy= GenerationType.IDENTITY )
    private Long id;
    private String nome;

    @JsonIgnore
    @ManyToMany (mappedBy = "categorias")
    private Set<Produto> produtos = new HashSet <>();

    public Categoria() {

    }

    public Categoria(Long id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Set<Produto> getProdutos() {
        return produtos;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Categoria other = (Categoria) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }    
}

Categoria Dto

public class CategoriaDto {
    private Long id;
    private String nome;
    private Set<Produto> produtos = new HashSet <>();

    public CategoriaDto() {

    }

    public CategoriaDto(Categoria categoria) {

        this.id = categoria.getId();
        this.nome= categoria.getNome();
        this.produtos= categoria.getProdutos();
    }

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public Set<Produto> getProdutos() {
        return produtos;
    }
    public void setProdutos(Set<Produto> produtos) {
        this.produtos = produtos;
    }

}

Categoria Service

@Service
public class CategoriaService {

    @Autowired
    private CategoriaRepository rep;

    public List<CategoriaDto> findAll(){
        return rep.findAll().stream().map(CategoriaDto::new).collect(Collectors.toList());
    }

    public CategoriaDto findById(Long id) {
        return new CategoriaDto(rep.findById(id).get());

    }
}

Ta dando esse erro para ser exato, mas acho que a lógica não deve estar correta

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Olá, Gabriel! Tudo certinho?

Desculpa pela demora em obter retorno.

Acredito que o problema não seja relacionado à anotação em si, mas no tipo de dado que você está manipulando: seu construtor de Produto deve receber um elemento do tipo Categoria, mas está recebendo um elemento CategoriaDto. Assim, uma solução seria criar um método conversor para converter Categoria em CategoriaDto.

Espero ter ajudado!

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!