Modelagem VS org.hibernate.NonUniqueObjectException

0 respostas
hyr4x

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;
}
Criado 5 de agosto de 2010
Respostas 0
Participantes 1