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

Duvida referente ao JPA eu acredito que seja esse o problema

Ola, alguém pode me ajudar?

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeComo faço para passar o id da outra classe? sendo que no banco eu criei o campo categoria_id! Na classe DTO eu mando um Long categoria_id

3 respostas

Oi André!

Você vai precisar carregar a categoria pelo id no banco de dados e passar como parâmetro para o construtor. Algo como:

public Produto(CadastrarProdutoDTO dados, Categoria categoria) {
    this.nome = dados.nome();
    this.descricao = dados.descricao();
    this.preco = dados.preco();
    this.categoria = categoria;
}

Valeu Rodrigo! mas ainda não ficou claro,

minha tabela esta criado o campo categoria_id, onde eu envio pelo json certo?

{ "nome":"Pe de cabra ", "descricao":"Material feito em aço de carbono 35X20", "preco": 129.90, "categoria_id":2 }

porem na minha class Produto esse atributo não tem certo?

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

private String nome;

private String descricao;

private Double preco;

@ManyToOne

private Categoria categoria;

Como ele vai receber esse id vai receber ?

a minha DTO esta assim:

public record CadastrarProdutoDTO(String nome, String descricao, Double preco, Long categoria_id) {

}

ele imprime no console certo mas não grava no banco. o campo categoria_id se puder me orientar ainda acho que é JPA, ou tenho que criar o campo categoria_id?

solução!

O JSON e o DTO estão corretos, pois eles terão apenas o id da categoria. Mas na entidade Produto você precisa passar um objeto categoria "completo" e não apenas o id dela, precisando então carregar do banco de dados:

@PostMapping
@Transactional
public void cadastrar(@RequestBody @Valid CadastrarProdutoDTO dados) {
    var categoria = categoriaRepository.getReferenceById(dados.categoria_id());

    repository.save(new Produto(dados, categoria));
}