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));
}