Eu possuo o DTO e uma entidade, onde eu consigo alterar e remover itens normalmente. Acontece que quando eu tento adicionar novos itens a uma lista que já esta salva no banco de dados eu tenho recebido a seguinte exceção:
org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.projetonotafiscal.notafiscal.Entity.Itens
Minha classe onde persisto os itens é a classe NOTA que esta da seguinte forma:
@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;
@JsonManagedReference
@OneToMany(fetch = FetchType.EAGER, mappedBy = "nota", cascade = CascadeType.ALL)
private List<Itens> itens;
private Integer numero;
private Date data;
private BigDecimal valor_total;
Minha classe 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;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
private Nota nota;
private Integer ordenacao;
private BigDecimal quantidade;
private BigDecimal valor_total;
Na minha service, o método de atualizar esta assim:
public void atualizar(NotaDTO dto) {
Nota nota = repository.getReferenceById(dto.getId());
List<Itens> list = itensRepository.findAllByIdItens(nota);
BigDecimal somaTotal = BigDecimal.ZERO;
for (Itens item : list) { //Percorrendo a lista de itens que já esta salva no banco de dados
if (!dto.getItens().contains(itensRepository.getReferenceById(item.getId()))) {
itensRepository.deleteById(item.getId());
}
for (Itens itemDTO : dto.getItens()) { //Percorrendo a lista do dto que estou recebendo
if (itemDTO.getId() == null) {
int ordenacao = itensRepository.findByUltimaOrdencao(nota);
item.setOrdenacao(ordenacao++);
Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());
item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
somaTotal = somaTotal.add(item.getValor_total());
item.setNota(nota);
break;
}
if (item.getId() == itemDTO.getId()) {
item.setQuantidade(itemDTO.getQuantidade());
break;
}
}
Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());
item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
somaTotal = somaTotal.add(item.getValor_total());
}
nota.setValor_total(somaTotal);
nota.atualizar(dto);
}
Pelo que andei estudando o erro acontece com o cascade, porém tentei de todas as formas e o erro permanece. Quando uso o cascade = CascadeType.DETACH não acontece o insert e muito menos o update nas duas tabelas. Como resolver esta situação?