[RESOLVIDO]org.hibernate.NonUniqueObjectException

Ola galera boa tarde!

Estou tendo um probleminha com o hibernate.

Na hora de atualizar os dados ou na hora de deletar dá esse erro:
[color=red] org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.vetta.entidades.Pessoa#2]
[/color]

minha entidade Pessoa:

@Entity
public class Pessoa {
	
	@Id
	@GeneratedValue
	@Column(name = "id_pessoa")
	private int idPessoa;
	
	@NotEmpty
	private String nome;
	private String sobenome;
	@NotEmpty
	private String cpf;
	private int idade;
	private int telefone;
	@Email
	private String email;
	@NotEmpty
	private String usuario;
	@NotEmpty
	private String senha;
	
	
	public int getIdPessoa() {
		return idPessoa;
	}
	public void setIdPessoa(int idPessoa) {
		this.idPessoa = idPessoa;
             //mais getters e setters aqui...

O que é isso?

Amigo

Você não atribuiu nenhum strategy ou generator à anotação @GeneratedValue o que poderá lhe causar problemas (não sei qual o comportamento assumido pelo hibernate neste caso).

Entretanto, com toda e absoluta certeza o seu software está violando uma constraint do banco que garante uma informação única para cada registro, dada a mensagem, aparentemente isto ocorre pois você está tentando inserir um registro no banco com um id já existente.

Lhe pergunto, você está atribuindo este ID manualmente? A operação que o seu EntityManager está tentando executar que gera tal exceção é uma ação de inserção mesmo ou está tentando atualizar algo?

Dica: Caso seu banco use o conceito de sequences você precisará de algo assim mais ou menos:

	@GenericGenerator(name="native", strategy="native", 
			parameters={@Parameter(name="sequence", value="SUA_SEQUENCE_AQUI"),
			@Parameter(name="schema", value=SEU_SCHEMA)})

E caso esteja utilizando algo que garanta a linearidade dos identificados implicitamente como o auto_increment do MySQL:

@Id
	@GeneratedValue(strategy=GenerationType.AUTO)

ps: Estude a javadoc de GenerationType para verificar se AUTO satisfaz sua necessidade, algum dos enum’s contidos ali será o suficiente para resolver seu problema!

:slight_smile:

carao companheiro jayrmotta,

Eu estou usando o auto_increment, por default o @GeneratedValue usa o GenerationType.AUTO, por isso nao coloquei nada.(pelo menos meu professor falou isso!)

O problema acontece na hora de alterar ou excluir algum dado da este erro.

Eu nao uso o session.close() pode ser isso??

Eu acho que não tem haver com nada relacionado com infra-estrutura e sim que a operação que você está executando ao invés de executar um update (por perceber que a entidade já existe no banco) está executando um insert.

Qual operação(método) você está usando e de qual tecnologia? JPA ou Hibernate direto?

[quote=jayrmotta]Eu acho que não tem haver com nada relacionado com infra-estrutura e sim que a operação que você está executando ao invés de executar um update (por perceber que a entidade já existe no banco) está executando um insert.

Qual operação(método) você está usando e de qual tecnologia? JPA ou Hibernate direto?[/quote]

Estou usando Hibernate 3.2 e utilizo o metodo session.update() para fazer a alteraçao!
Meu metodo para alterar

public void alterarUsuario(Pessoa pessoa) {
		// TODO Auto-generated method stub
		session = HibernateSessionFactory.getSession();
	
		try {
			session.beginTransaction().begin();
			session.update(pessoa);
			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			System.out.println(e);
		} finally {
			session.close();
		}
	}

este erro pode ser porque tenhu uma assossiaçao com outra tabela?

A outra tabela é esta:

@Entity
public class Contatos {
	@Id
	@GeneratedValue
	private int id;
	
	@NotEmpty
	private String nome;
	@Column(length = 3)
	private int idade;
	@Email
	private String email;
	private String telefone;
	private String celular;
	
	@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumn(name = "id_pessoa")
	private Pessoa pessoa;

	public int getId() {
		return id;
	}
           //getters e setters aqui...

Só um detalhe, as vezes é necessário ativar auto increment no banco de dados, caso MySQL.

dei uma olhada rápido no tópico, mas não vi a solução (não procurei muito bem rssss)

se tiver sido informada uma solução que eu não tenha vista, não custa nada dar outra possível solução.

tive um problema semelhante, meu código estava assim:


   session.update(obj);

mudei para esta forma e funfou na boa:


   session.merge(obj);

pode ser que salve alguém futuramente.

4 curtidas