Hibernate dando erro ao encontrar duas linhas com o mesmo id

2 respostas
J

Pessoal,

Estou obtendo o seguinte erro do hibernate:

More than one row with the given identifier was found: 1, for class: camisas.modelo.Pedido

Ja dei uma pesquisada e vi que poderia ser a integridade referencial do meu Bd, revi e não achei erro, até porque na minha tabela pedido a PK nao esta repetida, apenas as FK. Vi que podia ser problemas com hashCode e equals, implementei e nada tambem. Estava tudo funcionando, pois soh tinha um pedido de cada usuario, quando gerei um segundo pedido para um determinado usuario, começou a dar isso, por favor, conto com a ajuda de voces, tenho que entregar esse projeto amanha.

Minhas entidades:

Pedido
package camisas.modelo;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "pedido", schema = "camisas")
public class Pedido implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;
  
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "camisa", referencedColumnName = "id", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.ALL)
    private Camisa camisa;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "usuario", referencedColumnName = "id", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.ALL)
    private PessoaFisica usuario;

    @Temporal(TemporalType.DATE)
    @Column(name = "data_pedido")
    private Date data;

    @Column(name = "valor_total")
    private int valorTotal;
    
    @OneToOne
    @JoinColumn(name = "forma_pgto", referencedColumnName = "id", insertable = true, updatable = true)
    @Cascade(CascadeType.ALL)
    private FormaPagamento formaPagamento;

    @Column(name = "situacao")
    private String situacao;
    
    public Pedido() {
        
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Camisa getCamisa() {
        return camisa;
    }

    public void setCamisa(Camisa camisa) {
        this.camisa = camisa;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public PessoaFisica getUsuario() {
        return usuario;
    }

    public void setUsuario(PessoaFisica usuario) {
        this.usuario = usuario;
    }

    public int getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(int valorTotal) {
        this.valorTotal = valorTotal;
    }

    public FormaPagamento getFormaPagamento() {
        return formaPagamento;
    }

    public void setFormaPagamento(FormaPagamento formaPagamento) {
        this.formaPagamento = formaPagamento;
    }

    public String getSituacao() {
        return situacao;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Pedido other = (Pedido) obj;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + this.id;
        return hash;
    }

}
Usuario
package camisas.modelo;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "usuario", schema = "camisas")
@PrimaryKeyJoinColumn(name = "pessoa_fisica")
public class Usuario extends PessoaFisica implements Serializable {

    @Column(name = "login")
    private String login;

    @Column(name = "senha")
    private String senha;

    @Column(name = "ativo")
    private String ativo;

    @OneToMany(mappedBy = "usuario", fetch = FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private Collection<Pedido> pedidos;

    public Usuario() {
        
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getAtivo() {
        return ativo;
    }

    public void setAtivo(String ativo) {
        this.ativo = ativo;
    }

    public Collection<Pedido> getPedidos() {
        return pedidos;
    }

    public void setPedidos(Collection<Pedido> pedidos) {
        this.pedidos = pedidos;
    }
   
}
PedidoDAO
package camisas.dao;

import camisas.modelo.Pedido;
import camisas.modelo.Usuario;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

public class PedidoDAO extends GenericDAO<Pedido> {

    public PedidoDAO(Session session, Class<?> classe) {
        super(session, classe);
    }

    public Pedido carregarPedidoPeloId(int id) {
        Criteria c = session.createCriteria(Pedido.class);
        c.add(Restrictions.eq("id", id));

        return (Pedido) c.uniqueResult();
    }
    

    public List<Pedido> listarPedidosDoUsuario(int idUser) {
        Criteria c = session.createCriteria(Pedido.class);
        UsuarioDAO usuarioDao = new UsuarioDAO(session, Usuario.class);
        Usuario usuario = usuarioDao.carregarUsuarioPeloId(idUser);
        Criterion _pedido = Restrictions.eq("usuario", usuario);
        c.add(_pedido);

        return c.list();
    }
}

Estou ha tanto tempo em cima desse erro que nem sei mais o que faço, se precisarem de outras classes, me falem, por favor, nao sei nem o que colcoar aqui.

Minha tabela pedido esta assim:
id int PK
camisa int FK referenciando a tabela camisa
usuario int FK referenciando a tabela usuario
data date
valor int
situacao varchar

Desde ja agradeço

2 Respostas

remixlara

Esse erro ocorre quando vc vai inserir no banco ou vai fazer uma consulta?

pelo que eu vi esse erro deve ser quando você carrega do banco. Isso ocorre muito quando você tenta chamar o método uniqueResult() e existe mais de um resultado a ser retornado.

verifica novamente os cadastros no banco e vê se tem alguma repetição ou verifica sua consulta usando o Criterion

J

Esse erro acontece quando eu vou fazer uma consulta.
Eu ja verifiqei e uso o comando LIST do criteria e nao uniqueResult

Criado 21 de maio de 2010
Ultima resposta 22 de mai. de 2010
Respostas 2
Participantes 2