[Resolvido] Org.hibernate.MappingException "Unknown entity"

Estou lendo o livro “Programação Java para a Web”. No capitulo 3 o autor explica como configurar o hibernate criando uma classe para criar o objeto SessionFactory, uma classe CONTATO que faz através das annotations o ORM e uma classe para efetuar o CRUD - CONTATOCRUDANNOTATIONS.
Fiz a realização do passo a passo conforme o autor pede, mas ao executar a classe CONTATOCRUDANNOTIONS, dispará a seguinte Exception:

Exception in thread "main" org.hibernate.MappingException: Unknown entity: br.com.javaparaweb.capitulo3.crudannotations.Contato
	at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1096)
	at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1443)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:116)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
	at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
	at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
	at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
	at br.com.javaparaweb.capitulo3.crudannotations.ContatoCrudAnnotations.salvar(ContatoCrudAnnotations.java:20)
	at br.com.javaparaweb.capitulo3.crudannotations.ContatoCrudAnnotations.main(ContatoCrudAnnotations.java:58)

XML: hibernate.cfg.xml

      <!-- Usando as configurações do C3PO para pool de conexões -->
      <property name="c3po.min_size">5</property>
      <property name="c3po.max_size">20</property>
      <property name="c3po.timeout">300</property>
      <property name="c3po.max_statements">50</property>
      <property name="c3po.idle_test_period">3000</property>
      <property name="show_sql">true</property>
      <property name="format_sql">true</property>
      <property name="generate_statistics">true</property>
      <property name="use_sql_comments">true</property>
      <mapping class="Contato" package="br.com.javaparaweb.capitulo3.crudannotations"/>  
     </session-factory>
    </hibernate-configuration>

Class: ContatoCrudAnnotations

import java.sql.Date;
import java.util.List;

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

import br.com.javaparaweb.capitulo3.conexao.HibernateUtil;

public class ContatoCrudAnnotations {
	private Session sessao;

	public ContatoCrudAnnotations(Session sessao) {
		this.sessao = sessao;
	}

	public void salvar(Contato contato) {
		sessao.save(contato);
	}

	public void atualizar(Contato contato) {
		sessao.update(contato);
	}

	public void excluir(Contato contato) {
		sessao.delete(contato);
	}

	@SuppressWarnings("unchecked")
	public List<Contato> listar() {
		Query consulta = sessao.createQuery("from Contato");
		return consulta.list();
	}

	public Contato buscaContato(int valor) {
		
		Query consulta = sessao.createQuery("from Contato where codigo = :parametro");
		
		consulta.setInteger("parametro", valor);
		
		return (Contato) consulta.uniqueResult();
	}

	public static void main(String[] args) {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		Transaction transacao = sessao.beginTransaction();

		ContatoCrudAnnotations contatoCrud = new ContatoCrudAnnotations(sessao);

		Contato contato1 = new Contato();
		contato1.setNome("Solanu");
		contato1.setTelefone("(47) 3333-4444");
		contato1.setEmail("solanu@javaparaweb.com.br");
		contato1.setDataCadastro(new Date(System.currentTimeMillis()));
		contato1.setObservacao("Novo cliente");
		contatoCrud.salvar(contato1);

		contato1.setObservacao("Retomar contato");
		contatoCrud.atualizar(contato1);

		Contato contato2 = new Contato();
		contato2.setNome("Lunare");
		contato2.setTelefone("(47) 7777-5555");
		contato2.setEmail("lunare@javaparaweb.com.br");
		contato2.setDataCadastro(new Date(System.currentTimeMillis()));
		contato2.setObservacao("Cliente em dia");
		contatoCrud.salvar(contato2);

		System.out.println("Total de registros cadastrados: " + contatoCrud.listar().size());

		contatoCrud.excluir(contato2);

		transacao.commit();

		System.out.println("Total de registros cadastrados: " + contatoCrud.listar().size());
	}

}

Class: Contato

i mport java.sql.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="contato")
public class Contato {

	@Id
	@GeneratedValue
	@Column(name = "codigo")
	private Integer codigo;

	@Column(name = "nome", length = 50, nullable = true)
	private String nome;

	@Column(name = "telefone", length = 50, nullable = true)
	private String telefone;

	@Column(name = "email", length = 50, nullable = true)
	private String email;

	@Column(name = "dt_cad", nullable = true)
	private Date dataCadastro;

	@Column(name = "obs", nullable = true)
	private String observacao;

	//getters and setters
	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone() {
		return telefone;
	}

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

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

}

Arquivo: pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>javaparaweb</groupId>
	<artifactId>exemploshibernate</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Exemplos do Hibernate</name>
	<description>Exemplo de conexão com o banco de dados usando Hibernate</description>
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.30</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>4.3.4.Final</version>
		</dependency>
	</dependencies>
</project>

Gostaria de saber como resolver o problema. Já li diversos fóruns e nenhuma solução funcionou.

<mapping class="br.com.javaparaweb.capitulo3.crudannotations.Contato" />

:wink:

1 curtida

quivirtuoso De principio eu tinha feito conforme você mencionou, mas infelizmente nem da forma como está e nem como funciona. O erro é o mesmo.

Se voce está usando annotation (e deve!) nao precisa do mapping… nem nenhum arquivo .hbm.xml (este era o arquivo usado antes das annotations)

guivirtuoso
Valeu pela ajudar, acho que era algum erro do Eclipse Mars.
Deletei o projeto e recriei do zero utilizando a tag mapping do xml como você me orientou e por fim deu certo.
Valeu pela ajuda.

1 curtida

Boa noite estou usando esta livro e também estou com essa dificuldade, execução esta dando o mesmo erro que o seu.

Altere o mapeamento:
<mapping class="Contato" package="br.com.javaparaweb.capitulo3.crudannotations"/>

Para:
<mapping class="br.com.javaparaweb.capitulo3.crudannotations.Contato" />

Conforme @guivirtuoso mencionou