Hibernate: More than one row with the given identifier was found: 60

9 respostas
S

Bom pessoal, sou novo aqui. E estou com esse erro no titulo: More than one row with the given identifier was found: 60.

No caso o 60, seria o id do cliente.

Possuo uma tabela chamada am_chamadas, onde ficarão todas as chamadas dos clientes.
Só que se um cliente fizer mais de uma chamada, ele dá esse erro. Sendo que o campo id_cliente não é primary key. Como arrumar? Tem algo a ver com relacionamentos?

O código de consulta é: Query consulta = sessao.createQuery("from ChamadaTO chamada");

Preciso de ajuda um quanto antes.

[]'s

9 Respostas

D

Cara…

pelo oque eu entendi ele ta dizendo que achou mais de uma linha com o valor 60…

de uma olhada nas suas tabelas e nos seus relacionamentos de chave primaria e estrangeira…

Espero ter ajudado…

R

Olá,

O que pode ta acontecendo é vc tá dando algum “consulta.uniqueResult()”, esperando que sua consulta retorne apenas um resultado. Mas como tem mais de um, da esse erro que vc apontou.

[]´s

A

rodrigo_gomes:
Olá,

O que pode ta acontecendo é vc tá dando algum “consulta.uniqueResult()”, esperando que sua consulta retorne apenas um resultado. Mas como tem mais de um, da esse erro que vc apontou.

[]´s

Estranho, esse erro está parecendo mais violação de PK mesmo.

Dê uma olhada nesse post http://www.guj.com.br/posts/list/40512.java

Posta sua classe Chamada com os mapeamentos para darmos uma olhada

Abraços.

R

Pode ser, mas eu já tive esse erro nessas condições em que falei (não lembro se a mensagem era exatamente essa). Olhe as duas coisas :wink:
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/NonUniqueResultException.html

S

Aqui está a minha classe ChamadaTO

@Entity
@Table(name="am_chamada")
@SuppressWarnings("serial")
public class ChamadaTO implements Serializable
{
	@Id
	@Column(name="id")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq_am_chamada")
	@SequenceGenerator(name="seq_am_chamada", sequenceName="seq_am_chamada", allocationSize=1)
	public Integer id;//id da chamada
	
	@Column(name="id_cidade")
	public Integer id_cidade;//cidade destino (id)
	
	@Column(name="destino")
	public Integer telefone;//numero tel destino
	
	@Column(name="origem")
	public Integer origem;//cidade do plano (nome)
	
	@Column(name="duracao")
	public float duracao;//duracao em segundos
	
	@Column(name="datahora")
	public Date data;//data e hora da ligacao
	
	@OneToOne
	@JoinColumn(name="id_cliente")
	public ClienteTO cliente;//id do cliente da ligacao
	
	@Column(name="valor")
	public double valor;//calculo da tarifa (de acordo com tipo de aparelho chamado/tipo de ligacao) X (segundos/60)
	
	@Column(name="localidade")
	public Integer localidade;// composto por ddi+ddd+numero(de 8 digitos)

	
	public ClienteTO getCliente()
	{
		return cliente;
	}

	public void setCliente(ClienteTO cliente)
	{
		this.cliente = cliente;
	}

	public Date getData()
	{
		return data;
	}

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

	public Integer getTelefone()
	{
		return telefone;
	}

	public void setTelefone(Integer telefone)
	{
		this.telefone = telefone;
	}

	public float getDuracao()
	{
		return duracao;
	}

	public void setDuracao(float duracao)
	{
		this.duracao = duracao;
	}

	public Integer getId()
	{
		return id;
	}

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

	public Integer getLocalidade()
	{
		return localidade;
	}

	public void setLocalidade(Integer localidade)
	{
		this.localidade = localidade;
	}

	public Integer getOrigem()
	{
		return origem;
	}

	public void setOrigem(Integer origem)
	{
		this.origem = origem;
	}

	public double getValor()
	{
		return valor;
	}

	public void setValor(double valor)
	{
		this.valor = valor;
	}

	public Integer getId_cidade()
	{
		return id_cidade;
	}

	public void setId_cidade(Integer id_cidade)
	{
		this.id_cidade = id_cidade;
	}
}

Eu vi aquele tópico, mas não entendo muito bem, a implementação do hashcode e do equals que um usuario postou no tópico. Será que é erro de relacionamento?

A

Olá,

Faz um select aí no seu banco.

select * from <tabela_cliente> where id_cliente = 60;

Se retornar mais que uma linha é problema com a integridade dos dados, nesse caso violou uma PK e consequentemente o hibernate está acusando problema no mapeamento da propriedade

public ClienteTO cliente;

Abraços.

S

No oracle retorna certinho. Mas como posso arrumar?

R

Olá,

Implemente os métodos equals e hashCode em seus objetos que são persistidos pelo hibernate.

ps: só por curiosidade, coloque o código do método que está com problema.

S

Ja implementei o hashcode e o equals.

Aqui vai o metodo do DAO que lista as chamadas

public List<ChamadaTO> findAllByDate(Integer id) throws DAOException
	{
		log.debug("Listando chamadas no objeto [" +  ChamadaDAO.class + "].");
		
		Session sessao = HibernateUtil.openSession();
		
		Query consulta = sessao.createQuery("from ChamadaTO chamada where chamada.cliente.id = :id")
		.setInteger("id", id);
		
		return consulta.list();
	}

Sò uma dúvida, não precisa fechar a sessão quando usa Query né?

Criado 3 de novembro de 2007
Ultima resposta 4 de nov. de 2007
Respostas 9
Participantes 4