Olá pessoal. Estou com um problema aqui e espero que vocês me ajudem.
Tenho quatro classes: Venda, ItemDeVenda, Produto e Estoque.
A classe Estoque representa o estoque de varejo e de atacado de um determinado Produto.
A classe Produto é uma entidade que define um objeto a ser vendido, possuindo um nome, um Estoque e as unidades de venda para varejo e atacado.
A classe ItemDeVenda representa o item que foi vendido. Esta classe deve conter um Produto, a quantidade vendida do produto e o preço da venda e se a venda foi para Varejo ou Atacado.
A classe Venda tem uma lista de ItemDeVenda (entre outros atributos irrelevantes para meu problema).
O problema é que quando uma venda é efetuada ela pode conter vários itens com o mesmo produto e então o hibernate lança a fomosa org.hibernate.NonUniqueObjectException.
Um cliente pode querer comprar o mesmo produto duas vezes. Sendo uma como varejo e outra como atacado. Isso é um fato inerente ao negócio. Não tem como remediar pois os preços de venda de varejo e atacado são distintos.
Exemplo: Um determinado cliente solicita uma caixa de caneta (atacado) para revender e mais três canetas (varejo) para uso.
No caso acima a venda vai possuir dois itens de vendas distintos porém com o mesmo Produto. Já pensei em recalcular tudo... vamos supor que a caixa de canetas possua 100 unidades e tentar definir um unico item de venda com 1,03 caixa de caneta. O problema dessa solução é que não fica tão legível.
Aceito sugestões de remodelagem.
Não sei se fui claro mas agradeço desde já a ajuda de vocês. Abaixo segue as classes:
@Entity
public class Venda extends Persistivel {
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "venda_id")
private List<ItemDeVenda> itensDeVenda = new ArrayList<ItemDeVenda>();
/**
* Este metodo adiciona um item de venda a lista de itens e recalcula
* o estoque.
*
* @param item
*/
public void adicionarItem(ItemDeVenda item) {
this.recalculaEstoque(item.getProduto());
this.itensDeVenda.add(item);
}
}
@Entity
public class ItemDeVenda extends Persistivel {
@ManyToOne
@JoinColumn(name = "venda_id")
private Venda venda;
/* representa o preco que o produto foi vendido */
private BigDecimal preco;
/* representa a quantidade do produto vendido */
private Integer quantidade;
/* venda varejo ou atacado */
private TipoVenda tipoVenda;
/* representa o produto vendido */
@OneToOne(cascade = CascadeType.ALL)
private Produto produto;
}
@Entity
public class Produto extends Persistivel {
private String nome;
@OneToOne
@JoinColumn(name = "unidadeVarejo_id")
private Unidade unidadeVarejo;
@OneToOne
@JoinColumn(name = "unidadeAtacado_id")
private Unidade unidadeAtacado;
@OneToOne(cascade = CascadeType.ALL)
private Estoque estoque;
}
@Entity
public class Estoque extends Persistivel {
@OneToOne(mappedBy = "estoque")
private Produto produto;
private Integer varejo = 0;
private Integer atacado = 0;
}