Metodo session.get(Class, Serializable) - Hibernate

Bom dia galera. Estou vendo o hibernate e estou fazendo um teste e esta dando um erro.

More than one row with the given identifier was found: 1, for class: br.com.mgf.modelo.Pessoa

Mas no banco de dados nao tem mais que um registro com esse codigo.

mysql&gt select * from pessoa;
+----------+--------------------------+---------+--------------+--------------+
| idPessoa | email                    | nome    | telefone     | idEnderecoFk |
+----------+--------------------------+---------+--------------+--------------+
|        1 | diego@mgfinformatica.com | Diego   | 35-3522-2222 |            1 |

|        2 | diego@mgfinformatica.com | Diego   | 35-3522-2222 |            1 |

|        3 | luc@mgfinformatica.com   | Luciano | 35-3522-2222 |            3 |

+----------+--------------------------+---------+--------------+--------------+
3 rows in set (0.00 sec)

Na minha consulta esta assim.

package br.com.mgf.dao;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.mgf.modelo.Endereco;
import br.com.mgf.modelo.Pessoa;
import br.com.mgf.modelo.Professor;
import br.com.mgf.util.HibernateUtil;

public class Dao {

	/**
	 * @param args
	 */
	private static final  Transaction tx;
	private static final Session session;
	
	static{
		session = new HibernateUtil().getSession();
		tx = session.beginTransaction();
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Professor professor = new Professor();
		professor.setIdPessoa(2L);
		professor = (Professor) new Dao().atualiza(professor);
		
		session.save(professor);
		tx.commit();
		session.close();
				
	}
	
	public Pessoa atualiza(Pessoa pessoa){
		
		Session session = new HibernateUtil().getSession();
		Pessoa p = (Pessoa) session.get(Pessoa.class, pessoa.getIdPessoa());
		System.out.println(p.getNome() + " " + p.getEndereco().getBairro());
		Endereco endereco = null;
		endereco = p.getEndereco();
		endereco.setBairro("Penha");
		p.setEndereco(endereco);
		System.out.println(p.getNome() + " " + p.getEndereco().getBairro());
		return p;
		
	}

}

O meu Entity Pessoa e Professor estao relacionados pela herança.

package br.com.mgf.modelo;

import java.io.Serializable;

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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.omg.PortableInterceptor.INACTIVE;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "Pessoa")
public abstract class Pessoa implements Serializable {
	
	private Long idPessoa;
	private String nome;
	private String email;
	private String telefone;
	private Endereco endereco;
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "idEnderecoFk")
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	
	@Column(name = "email", length = 25)
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "idPessoa")
	public Long getIdPessoa() {
		return idPessoa;
	}
	public void setIdPessoa(Long id) {
		this.idPessoa = id;
	}
	
	@Column(name = "nome", length = 30)
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	@Column(name = "telefone", length = 15)
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	
	public boolean equals(Object obj){
		
		if (obj == null){
			return false; 
		} else {
			if (obj instanceof Pessoa){
				return true;
			} else {
				return false;
			}
		}
		
	}
	
	public int hashCode(){
		int resultado = 10;
		resultado *= 20 + this.getIdPessoa().hashCode();
		return resultado;
	}
	
	
	

}

Entity Professor

package br.com.mgf.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
public class Professor extends Pessoa implements Serializable {
	
	private String graduacao;
	
	@Column(name = "graduacao")
	public String getGraduacao() {
		return graduacao;
	}

	public void setGraduacao(String graduacao) {
		this.graduacao = graduacao;
	}
	

}

Espero que vcs me ajudem…

  1. Em teoria deveria funcionar prq vc tem a entidade 1, sera que o hibernate e seu console estão apontando para o mesmo banco?

  2. Vc esta abrindo sua transação no lugar errado, dentro do static

tx = session.beginTransaction();

Vc deve abrir sua transação no momento em que vc precisa dela, no seu caso dentro do mentodo.

  1. Vc colocou a classe Pessoa no hibernate.cfg.xml?

Abdon.
Eu usei o hibernate.properties…
e usei o metodo para gerar o banco.

package br.com.mgf.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

import br.com.mgf.modelo.Endereco;
import br.com.mgf.modelo.Pessoa;
import br.com.mgf.modelo.Professor;

public class HibernateUtil {
	
	private static final SessionFactory sessionFactory;
	
	static{
		try {
			AnnotationConfiguration conf = new AnnotationConfiguration();
			conf.addPackage("br.com.mgf.modelo");
			conf.addAnnotatedClass(Pessoa.class);
			conf.addAnnotatedClass(Endereco.class);
			conf.addAnnotatedClass(Professor.class);
			sessionFactory = conf.buildSessionFactory();
			new SchemaExport(conf).create(true, true);
			
		} catch (Throwable e){
			throw new ExceptionInInitializerError(e);
		}
	}
	
	public static Session getSession(){
		Session session = sessionFactory.openSession();
		return session;
	}
}

O que vc acha???

Acho legal, so que eu acho que não resolve o seu problema.

Abdon;…
Consegui…
Era o que vc tinha me dito a respeito da inicializacao da Transacao. Passei ela direto para o metodo main e funcionou…

Valeu

Deu o mesmo erro denovo…Na tabela Pessoa…
Se eu tenho mais que um registro na tabela ele da o erro…Logico que com id diferente…
O que sera isso?

Posta o metodo aonde deu o erro.

O erro é esse:

Exception in thread "main" org.hibernate.HibernateException: More than one row with the given identifier was found: 3, for class: br.com.mgf.modelo.Pessoa
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:69)
	at org.hibernate.loader.entity.EntityLoader.loadByUniqueKey(EntityLoader.java:85)
	at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:1596)
	at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:608)
	at org.hibernate.type.EntityType.resolve(EntityType.java:382)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
	at org.hibernate.loader.Loader.doQuery(Loader.java:717)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
	at org.hibernate.loader.Loader.loadEntity(Loader.java:1851)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
	at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2992)
	at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
	at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
	at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:98)
	at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
	at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:836)
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:66)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:140)
	at br.com.mgf.modelo.Pessoa$$EnhancerByCGLIB$$901fb793.getNome(<generated>)
	at br.com.mgf.dao.Dao.atualiza(Dao.java:62)
	at br.com.mgf.dao.Dao.main(Dao.java:51)

Neste metodo

package br.com.mgf.dao;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.mgf.modelo.Endereco;
import br.com.mgf.modelo.Pessoa;
import br.com.mgf.modelo.Professor;
import br.com.mgf.util.HibernateUtil;

public class Dao {

	/**
	 * @param args
	 */
	private static  Transaction tx;
	private static Session session;
	
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		session = new HibernateUtil().getSession();
		tx = session.beginTransaction();
		Professor professor = new Professor();
		professor.setIdPessoa(4L);
		professor = (Professor) new Dao().atualiza(professor);
		session.update(professor);
		tx.commit();
		session.close();
				
	}
	
	public Pessoa atualiza(Pessoa pessoa){
		
		Session session = new HibernateUtil().getSession();
		Pessoa p = (Pessoa) session.get(Pessoa.class, pessoa.getIdPessoa()); // O erro aponta aqui
		System.out.println(p.getNome() + " " + p.getEndereco().getBairro());
		p.setNome("Jacui");
		Endereco endereco = null;
		endereco = p.getEndereco();
		endereco.setBairro("Penha");
		p.setEndereco(endereco);
		System.out.println(p.getNome() + " " + p.getEndereco().getBairro());
		return p;
		
	}

}

Sera que alguem pode me ajudar…Desculpe a pressa mais eu to doidinho com isso…

Obrigado

Estou com o mesmo problema, alguém conseguiu resolver?