Erro NonUniqueObjectException

8 respostas
J

boa tarde,

quando vou dar um merge em um novo “Produto” que possui uma list de “PedidoProduto” ocorre este erro:

javax.persistence.PersistenceException: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.sistema.modelo.PedidoProduto#57]

mas isto ocorre apenas quando insiro mais de um item apenas.

obrigado.

8 Respostas

A

cara,

vc ta com problema nos id da PedidoProduto, vc verificou se com alguma for de auto incremente nesses ids?

posta as suas entidades e qual BD vc ta usando.

t+

J

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package br.com.sistema.modelo;

import java.io.Serializable;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

/**
*

  • @author João Paulo
    
    */
    
    @Entity
    
    @Table(name = pedido_produto, catalog = gesp_queda_dev4, schema = public)
    
    @NamedQueries({
    
    @NamedQuery(name = PedidoProduto.findAll, query = SELECT p FROM PedidoProduto p),
    
    @NamedQuery(name = PedidoProduto.findByPedcodigo, query = SELECT p FROM PedidoProduto p WHERE p.pedcodigo = :pedcodigo),
    
    @NamedQuery(name = PedidoProduto.findByPedquantidade, query = SELECT p FROM PedidoProduto p WHERE p.pedquantidade = :pedquantidade),
    
    @NamedQuery(name = PedidoProduto.findByPedvalor, query = SELECT p FROM PedidoProduto p WHERE p.pedvalor = :pedvalor),
    
    @NamedQuery(name = PedidoProduto.findByPedvalortotal, query = SELECT p FROM PedidoProduto p WHERE p.pedvalortotal = :pedvalortotal),
    
    @NamedQuery(name = PedidoProduto.findByItecodigo, query = SELECT p FROM PedidoProduto p WHERE p.itecodigo = :itecodigo)})
    
    public class PedidoProduto implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    <a class="mention" href="/u/basic">@Basic</a>(optional = false)
    
    @Column(name = “pedquantidade”, nullable = false)
    
    private int pedquantidade;
    
    <a class="mention" href="/u/basic">@Basic</a>(optional = false)
    
    @Column(name = “pedvalor”, nullable = false)
    
    private double pedvalor = 0.0;
    
    @Column(name = “pedvalortotal”, precision = 17, scale = 17)
    
    private Double pedvalortotal = 0.0;
    
    @Id
    
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    
    <a class="mention" href="/u/basic">@Basic</a>(optional = false)
    
    @Column(name = “itecodigo”, nullable = false)
    
    private Integer itecodigo = 0;
    
    @JoinColumn(name = “tam_codigo”, referencedColumnName = “tam_codigo”, nullable = false)
    
    @ManyToOne(optional = false)
    
    private Tamanho tamCodigo = new Tamanho();
    
    @JoinColumn(name = “pro_codigo”, referencedColumnName = “pro_codigo”, nullable = false)
    
    @ManyToOne(optional = false)
    
    private Produto proCodigo = new Produto();
    
    @JoinColumn(name = “pedcodigo”, referencedColumnName = “pedcodigo”, nullable = false)
    
    @ManyToOne(optional = false)
    
    private Pedido pedcodigo = new Pedido();
    
    @JoinColumn(name = “cat_codigo”, referencedColumnName = “cat_codigo”, nullable = false)
    
    @ManyToOne(optional = false)
    
    private Categoria catCodigo = new Categoria();
    

    public PedidoProduto() {
    }

    public PedidoProduto(Integer itecodigo) {
    
    this.itecodigo = itecodigo;
    
    }
    
    public PedidoProduto(Integer itecodigo, int pedquantidade, double pedvalor) {
    
    this.itecodigo = itecodigo;
    
    this.pedquantidade = pedquantidade;
    
    this.pedvalor = pedvalor;
    
    }
    
    public int getPedquantidade() {
    
    return pedquantidade;
    
    }
    
    public void setPedquantidade(int pedquantidade) {
    
    this.pedquantidade = pedquantidade;
    
    }
    
    public String getPedvalor() throws Exception {
    
    return Formatadora.cvDoubleToString(pedvalor);
    
    }
    
    public void setPedvalor(String pedvalor) throws Exception {
    
    this.pedvalor = Formatadora.cvStringToDouble(pedvalor);
    
    }
    
    public String getPedvalortotal() throws Exception {
    
    return Formatadora.cvDoubleToString(pedvalortotal);
    
    }
    
    public void setPedvalortotal(String pedvalortotal) throws  Exception {
    
    this.pedvalortotal = Formatadora.cvStringToDouble(pedvalortotal);
    
    }
    
    public Integer getItecodigo() {
    
    return itecodigo;
    
    }
    
    public void setItecodigo(Integer itecodigo) {
    
    this.itecodigo = itecodigo;
    
    }
    
    public Tamanho getTamCodigo() {
    
    return tamCodigo;
    
    }
    
    public void setTamCodigo(Tamanho tamCodigo) {
    
    this.tamCodigo = tamCodigo;
    
    }
    
    public Produto getProCodigo() {
    
    return proCodigo;
    
    }
    
    public void setProCodigo(Produto proCodigo) {
    
    this.proCodigo = proCodigo;
    
    }
    
    public Pedido getPedcodigo() {
    
    return pedcodigo;
    
    }
    
    public void setPedcodigo(Pedido pedcodigo) {
    
    this.pedcodigo = pedcodigo;
    
    }
    
    public Categoria getCatCodigo() {
    
    return catCodigo;
    
    }
    
    public void setCatCodigo(Categoria catCodigo) {
    
    this.catCodigo = catCodigo;
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    public String toString() {
    
    return “modelo.PedidoProduto[itecodigo=” + itecodigo + “]”;
    
    }
    

}

só isso ou vc precisa de mais alguma coisa?

J

alissonvla:
cara,

vc ta com problema nos id da PedidoProduto, vc verificou se com alguma for de auto incremente nesses ids?

posta as suas entidades e qual BD vc ta usando.

t+

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package br.com.sistema.modelo;

import java.io.Serializable;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

/**
*

  • @author João Paulo
    */
    @Entity
    @Table(name = “pedido_produto”, catalog = “gesp_queda_dev4”, schema = “public”)
    @NamedQueries({
    @NamedQuery(name = “PedidoProduto.findAll”, query = “SELECT p FROM PedidoProduto p”),
    @NamedQuery(name = “PedidoProduto.findByPedcodigo”, query = “SELECT p FROM PedidoProduto p WHERE p.pedcodigo = :pedcodigo”),
    @NamedQuery(name = “PedidoProduto.findByPedquantidade”, query = “SELECT p FROM PedidoProduto p WHERE p.pedquantidade = :pedquantidade”),
    @NamedQuery(name = “PedidoProduto.findByPedvalor”, query = “SELECT p FROM PedidoProduto p WHERE p.pedvalor = :pedvalor”),
    @NamedQuery(name = “PedidoProduto.findByPedvalortotal”, query = “SELECT p FROM PedidoProduto p WHERE p.pedvalortotal = :pedvalortotal”),
    @NamedQuery(name = “PedidoProduto.findByItecodigo”, query = “SELECT p FROM PedidoProduto p WHERE p.itecodigo = :itecodigo”)})
    public class PedidoProduto implements Serializable {
    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = “pedquantidade”, nullable = false)
    private int pedquantidade;
    @Basic(optional = false)
    @Column(name = “pedvalor”, nullable = false)
    private double pedvalor = 0.0;
    @Column(name = “pedvalortotal”, precision = 17, scale = 17)
    private Double pedvalortotal = 0.0;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = “itecodigo”, nullable = false)
    private Integer itecodigo = 0;
    @JoinColumn(name = “tam_codigo”, referencedColumnName = “tam_codigo”, nullable = false)
    @ManyToOne(optional = false)
    private Tamanho tamCodigo = new Tamanho();
    @JoinColumn(name = “pro_codigo”, referencedColumnName = “pro_codigo”, nullable = false)
    @ManyToOne(optional = false)
    private Produto proCodigo = new Produto();
    @JoinColumn(name = “pedcodigo”, referencedColumnName = “pedcodigo”, nullable = false)
    @ManyToOne(optional = false)
    private Pedido pedcodigo = new Pedido();
    @JoinColumn(name = “cat_codigo”, referencedColumnName = “cat_codigo”, nullable = false)
    @ManyToOne(optional = false)
    private Categoria catCodigo = new Categoria();

public PedidoProduto() {
}

public PedidoProduto(Integer itecodigo) {

this.itecodigo = itecodigo;

}
public PedidoProduto(Integer itecodigo, int pedquantidade, double pedvalor) {

this.itecodigo = itecodigo;

this.pedquantidade = pedquantidade;

this.pedvalor = pedvalor;

}
public int getPedquantidade() {

return pedquantidade;

}
public void setPedquantidade(int pedquantidade) {

this.pedquantidade = pedquantidade;

}
public String getPedvalor() throws Exception {

return Formatadora.cvDoubleToString(pedvalor);

}
public void setPedvalor(String pedvalor) throws Exception {

this.pedvalor = Formatadora.cvStringToDouble(pedvalor);

}
public String getPedvalortotal() throws Exception {

return Formatadora.cvDoubleToString(pedvalortotal);

}
public void setPedvalortotal(String pedvalortotal) throws Exception {

this.pedvalortotal = Formatadora.cvStringToDouble(pedvalortotal);

}
public Integer getItecodigo() {

return itecodigo;

}
public void setItecodigo(Integer itecodigo) {

this.itecodigo = itecodigo;

}
public Tamanho getTamCodigo() {

return tamCodigo;

}
public void setTamCodigo(Tamanho tamCodigo) {

this.tamCodigo = tamCodigo;

}
public Produto getProCodigo() {

return proCodigo;

}
public void setProCodigo(Produto proCodigo) {

this.proCodigo = proCodigo;

}
public Pedido getPedcodigo() {

return pedcodigo;

}
public void setPedcodigo(Pedido pedcodigo) {

this.pedcodigo = pedcodigo;

}
public Categoria getCatCodigo() {

return catCodigo;

}
public void setCatCodigo(Categoria catCodigo) {

this.catCodigo = catCodigo;

}
<a class="mention" href="/u/override">@Override</a>

public String toString() {

return “modelo.PedidoProduto[itecodigo=” + itecodigo + “]”;

}

}

só isso ou vc precisa de mais alguma coisa?

A

cara,

primeiro, quando for postar algum codigo coloque dentro da tag code
segundo, poste a entidade produto tbm, qual banco vc ta utilizando?
vc utilizou alguma forma de auto incremento?

t+

J
alissonvla:
cara,

primeiro, quando for postar algum codigo coloque dentro da tag code
segundo, poste a entidade produto tbm, qual banco vc ta utilizando?
vc utilizou alguma forma de auto incremento?

t+

utilizo o postgres 8.4, tenho outros cadastros q funcionam perfeitamente, so este ta dando problema, o auto incremente fica por conta do banco de dados defino a chave como "serial"-auto incremente do postgres.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.sistema.modelo;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 *
 * @author João Paulo
 */
@Entity
@Table(name = "produto", catalog = "gesp_queda_dev4", schema = "public")
@NamedQueries({
    @NamedQuery(name = "Produto.findAll", query = "SELECT p FROM Produto p"),    
    @NamedQuery(name = "Produto.findByProCodigo", query = "SELECT p FROM Produto p WHERE p.proCodigo = :proCodigo"),
    @NamedQuery(name = "Produto.findByProDescricao", query = "SELECT p FROM Produto p WHERE p.proDescricao = :proDescricao"),
    @NamedQuery(name = "Produto.findByProControle", query = "SELECT p FROM Produto p WHERE p.proControle = :proControle"),
    @NamedQuery(name = "Produto.findByProCodncm", query = "SELECT p FROM Produto p WHERE p.proCodncm = :proCodncm"),
    @NamedQuery(name = "Produto.findByProAtivo", query = "SELECT p FROM Produto p WHERE p.proAtivo = :proAtivo"),
    @NamedQuery(name = "Produto.findByProColunaCfop", query = "SELECT p FROM Produto p WHERE p.proColunaCfop = :proColunaCfop"),
    @NamedQuery(name = "Produto.findByProInformacao", query = "SELECT p FROM Produto p WHERE p.proInformacao = :proInformacao"),
    @NamedQuery(name = "Produto.findByProVisualizarnaweb", query = "SELECT p FROM Produto p WHERE p.proVisualizarnaweb = :proVisualizarnaweb")})
public class Produto implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "pro_codigo", nullable = false)
    private Integer proCodigo;
    @Column(name = "pro_descricao", length = 60)
    private String proDescricao;
    @Column(name = "pro_controle", length = 10)
    private String proControle;
    @Column(name = "pro_codncm", length = 8)
    private String proCodncm;
    @Column(name = "pro_ativo")
    private Character proAtivo ='S';
    @Column(name = "pro_coluna_cfop")
    private Integer proColunaCfop = 1;
    @Column(name = "pro_informacao", length = 255)
    private String proInformacao;
    @Column(name = "pro_visualizarnaweb")
    private Boolean proVisualizarnaweb = false;
    @ManyToMany(mappedBy = "produtoList")
    private List<Cor> corList;
    @JoinColumn(name = "pro_codunidadevenda", referencedColumnName = "uni_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Unidade proCodunidadevenda = new Unidade();
    @JoinColumn(name = "pro_codtipo", referencedColumnName = "tip_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Tipo proCodtipo = new Tipo();
    @JoinColumn(name = "pro_codsubgrupo", referencedColumnName = "sub_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Subgrupo proCodsubgrupo = new Subgrupo();
    @JoinColumn(name = "pro_codsexo", referencedColumnName = "sex_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Sexo proCodsexo = new Sexo();
    @JoinColumn(name = "pro_codorigem", referencedColumnName = "ori_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Origem proCodorigem = new Origem();
    @JoinColumn(name = "pro_codmarca", referencedColumnName = "mar_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Marca proCodmarca  = new Marca();
    @JoinColumn(name = "pro_codgrupo", referencedColumnName = "grp_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Grupo proCodgrupo = new Grupo();
    @JoinColumn(name = "pro_codcfop", referencedColumnName = "cfo_codigo", nullable = false)
    @ManyToOne(optional = false)
    private Cfop proCodcfop = new Cfop();
    @Transient
    private Integer proTipoPesquisa =0;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "imaProCodigo")
    private List<ProdutoImagem> produtoImagemList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "icmCodproduto")
    private List<ProdutoIcms> produtoIcmsList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produto")
    private List<ProdutoCategoria> produtoCategoriaList;

    public Produto() {
    }

    public Produto(Integer proCodigo, String proDescricao, String proControle, Character proAtivo) {
        this.proCodigo = proCodigo;
        this.proDescricao = proDescricao;
        this.proControle = proControle;
        this.proAtivo = proAtivo;
    }

    public Produto(Integer proCodigo, String proDescricao, String proControle) {
        this.proCodigo = proCodigo;
        this.proDescricao = proDescricao;
        this.proControle = proControle;
    }

    public Produto(Integer proCodigo) {
        this.proCodigo = proCodigo;
    }

    public Integer getProCodigo() {
        return proCodigo;
    }

    public void setProCodigo(Integer proCodigo) {
        this.proCodigo = proCodigo;
    }

    public String getProDescricao() {
        return proDescricao;
    }

    public void setProDescricao(String proDescricao) {
        this.proDescricao = proDescricao;
    }

    public String getProControle() {
        return proControle;
    }

    public void setProControle(String proControle) {
        this.proControle = proControle;
    }

    public String getProCodncm() {
        return proCodncm;
    }

    public void setProCodncm(String proCodncm) {
        this.proCodncm = proCodncm;
    }

    public Character getProAtivo() {
        return proAtivo;
    }

    public void setProAtivo(Character proAtivo) {
        this.proAtivo = proAtivo;
    }

    public Integer getProColunaCfop() {
        return proColunaCfop;
    }

    public void setProColunaCfop(Integer proColunaCfop) {
        this.proColunaCfop = proColunaCfop;
    }

    public String getProInformacao() {
        return proInformacao;
    }

    public void setProInformacao(String proInformacao) {
        this.proInformacao = proInformacao;
    }

    public List<Cor> getCorList() {
        return corList;
    }

    public void setCorList(List<Cor> corList) {
        this.corList = corList;
    }

    public Unidade getProCodunidadevenda() {
        return proCodunidadevenda;
    }

    public void setProCodunidadevenda(Unidade proCodunidadevenda) {
        this.proCodunidadevenda = proCodunidadevenda;
    }

    public Tipo getProCodtipo() {
        return proCodtipo;
    }

    public void setProCodtipo(Tipo proCodtipo) {
        this.proCodtipo = proCodtipo;
    }

    public Subgrupo getProCodsubgrupo() {
        return proCodsubgrupo;
    }

    public void setProCodsubgrupo(Subgrupo proCodsubgrupo) {
        this.proCodsubgrupo = proCodsubgrupo;
    }

    public Sexo getProCodsexo() {
        return proCodsexo;
    }

    public void setProCodsexo(Sexo proCodsexo) {
        this.proCodsexo = proCodsexo;
    }

    public Origem getProCodorigem() {
        return proCodorigem;
    }

    public void setProCodorigem(Origem proCodorigem) {
        this.proCodorigem = proCodorigem;
    }

    public Marca getProCodmarca() {
        return proCodmarca;
    }

    public void setProCodmarca(Marca proCodmarca) {
        this.proCodmarca = proCodmarca;
    }

    public Grupo getProCodgrupo() {
        return proCodgrupo;
    }

    public void setProCodgrupo(Grupo proCodgrupo) {
        this.proCodgrupo = proCodgrupo;
    }

    public Cfop getProCodcfop() {
        return proCodcfop;
    }

    public void setProCodcfop(Cfop proCodcfop) {
        this.proCodcfop = proCodcfop;
    }

    public Integer getProTipoPesquisa() {
        return proTipoPesquisa;
    }

    public void setProTipoPesquisa(Integer proTipoPesquisa) {
        this.proTipoPesquisa = proTipoPesquisa;
    }

    public List<ProdutoImagem> getProdutoImagemList() {
        return produtoImagemList;
    }

    public void setProdutoImagemList(List<ProdutoImagem> produtoImagemList) {
        this.produtoImagemList = produtoImagemList;
    }

    public List<ProdutoIcms> getProdutoIcmsList() {
        return produtoIcmsList;
    }

    public void setProdutoIcmsList(List<ProdutoIcms> produtoIcmsList) {
        this.produtoIcmsList = produtoIcmsList;
    }

    public List<ProdutoCategoria> getProdutoCategoriaList() {
        return produtoCategoriaList;
    }

    public void setProdutoCategoriaList(List<ProdutoCategoria> produtoCategoriaList) {
        this.produtoCategoriaList = produtoCategoriaList;
    }

    public Boolean getProVisualizarNaWeb() {
        return proVisualizarnaweb;
    }

    public void setProVisualizarNaWeb(Boolean proVisualizarNaWeb) {
        this.proVisualizarnaweb = proVisualizarNaWeb;
    }
    

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (proCodigo != null ? proCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Produto)) {
            return false;
        }
        Produto other = (Produto) object;
        if ((this.proCodigo == null && other.proCodigo != null) || (this.proCodigo != null && !this.proCodigo.equals(other.proCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.sistema.modelo.Produto[proCodigo=" + proCodigo + "]";
    }

}
A

cara,

kd a lista de PedidoProduto na sua classe Produto?

t+

J

alissonvla:
cara,

kd a lista de PedidoProduto na sua classe Produto?

t+

entao adicionei mas mesmo assim continua, quando gravo o pedido com apenas um item ele grava normalmente o erro ocorre quando tento gravar o pedido com mais de um item.

A

cara,

pelo que eu percebi, esse seu relacionamento é manytomany, com atributos a mais na tabela de ligacao? se for isso, seu mapeamento está errado.
da uma olhada no que eu postei, vai resolver seu problema, http://www.guj.com.br/java/248978-resolvido-duvida-sobre-pk-e-erro-ao-inserir-no-banco-de-dados-usando-pk-gerado-pelo-netbeans

t+

Criado 23 de novembro de 2011
Ultima resposta 23 de nov. de 2011
Respostas 8
Participantes 2