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

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

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…

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

[quote=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 [/quote]

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.

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

Aqui está a minha classe ChamadaTO

[code]@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;
}

}[/code]

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?

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.

No oracle retorna certinho. Mas como posso arrumar?

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.

Ja implementei o hashcode e o equals.

Aqui vai o metodo do DAO que lista as chamadas

[code]public List 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();
}[/code]

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