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

Não esta salvando os dados na tabela

Tenho duas classes e tabelas, itens e nota. Quando salvo a nota deverá também salvar os itens e referenciar nos itens qual a sua nota. As entidades estão assim:

Itens:

@Entity(name = "Itens")
@Table(name = "itens")
public class Itens {

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_produto")
    private Produto produto;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Nota nota;
    private Integer ordenacao; //Integer
    private BigDecimal quantidade;
    private BigDecimal valor_total;

Nota:

@Entity(name = "Nota")
@Table(name = "nota")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Nota {

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "nota", cascade = CascadeType.ALL)
    private List<Itens> itens;

    private Integer numero;
    private Date data;
    private BigDecimal valor_total;

O problema é que quando estou salvando a nota, o id dela não esta sendo inserido na tabela de itens. Esta ficando assim: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O meu método salvar esta assim:

public Nota salvar(NotaDTO dto) {
        Nota nota = new Nota(dto);

        if (dto.getCliente() == null) {
            throw new ValidacaoException("É necessário informar um cliente .");
        }

        if (!clienteRepository.existsById(dto.getCliente().getId())) {
            throw new ValidacaoException("O cliente informado não existe.");
        }

        Cliente cliente = clienteRepository.getReferenceById(dto.getCliente().getId());

        Random random = new Random();
        int numeroAleatorio = random.nextInt();
        nota.setNumero(numeroAleatorio);

        int ordenacao = 1;
        BigDecimal somaTotal = BigDecimal.ZERO;

        for (Itens item : dto.getItens()) {
           item.setOrdenacao(ordenacao++);

            Long valor = item.getProduto().getId();
            Long valorUnitario = produtoRepository.findByValorUnitarioProduto(valor);

           item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
           somaTotal = somaTotal.add(item.getValor_total());
        }

        nota.setValor_total(somaTotal);

        nota = repository.save(nota);

        return nota;
    }

O que me deixou mais perdida foi que observando o console, os inserts na tabela de itens acontecem: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguém poderia me ajudar do porque o id da nota não está sendo inserido na tabela de itens?

2 respostas
solução!

Olá Natali, tudo bem?

Isso pode estar acontecendo porque você não está setando a nota nos itens antes de salvá-los.

Uma solução seria adicionar o seguinte código dentro do loop de itens, antes de salvar cada item:

item.setNota(nota);

Dessa forma, você estará setando a nota em cada item antes de salvá-lo, o que fará com que o id da nota seja inserido corretamente na tabela de itens.

Outra coisa que pode estar acontecendo é que você está confundindo o id da entidade, que está sendo preenchido com o esse outro campo id_nota, que pode ter sido criado de maneira redundante, além de não ter sido mapeado no seu objeto.

Espero ter ajudado e bons estudos!

Huum eu tinha pensado nisso mas havia colocado de fora do loop. Deu super certo aqui. Obrigada!