[RESOLVIDO] Erro no mapeamento das classes no hibernate usando anotations

3 respostas
mestrekame

Olá comunidade,

Estou aprendendo como usar o hibernate e anotations e no meu primeiro exemplo estou enfrentando uma excessão que não encontro solução. Procurei no forum mas os posts semelhantes nao resolveram, então estou criando esse novo.

Exception in thread "main" org.hibernate.MappingException: Unknown entity: pacote.Teste
        at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:550)
        at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
        at pacote.Main.main(Main.java:30)

Estou mapeando as classes no arquivo de configuração…

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/banco</property>
    <property name="hibernate.connection.username">usuario</property>
    <property name="hibernate.connection.password">123456</property>
    <property name="hibernate.connection.pool_size">10</property>

    <mapping class="pacote.Teste"/>
  </session-factory>
</hibernate-configuration>

HibernateUtil.java

package pacote;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration()
                    .configure()
                    .buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Teste.java

package pacote;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Entity;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="teste")
public class Teste{

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    @Column(name="id")
    private Integer id;

    @Column(name="nome")
    private String nome;

    /**
     * @return the id
     */
    
    public Integer getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @return the nome
     */

    
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

}

Main.java

package pacote;

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

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("Iniciando teste...");
        Session sessao = HibernateUtil.getSessionFactory().openSession();

        Transaction t = sessao.beginTransaction();

        Teste teste = new Teste();
        teste.setId(1);
        teste.setNome("maria");

        sessao.save(teste);

        t.commit();

        sessao.close();
    }

}

3 Respostas

getAdicted

Você não se esqueceu de mapear sua classe no HibernateUtil?

Exemplo:

public class HibernateUtil {  
  
    private static SessionFactory factory;  
  
    static {  
        AnnotationConfiguration cfg = new AnnotationConfiguration();  
        cfg.addAnnotatedClass(Usuario.class);  
cfg.addAnnotatedClass(OutraClasse.class);  
          
    }  
  
    public Session getSession() {  
        return factory.openSession();  
    }  
}

Atenção:

cfg.addAnnotatedClass(Usuario.class);  
        cfg.addAnnotatedClass(OutraClasse.class);

[]'s

mestrekame

Então, eu li em algum lugar que poderia se mapear no arquivo de configuração do hibernate (da forma que fiz), ou no HibernateUtil.java. Tentei das duas formas mas não obtive sucesso. :frowning:

mestrekame

Parece que achei a solução:

Deve-se mudar o import do arquivo Teste.java

tirar: import org.hibernate.annotations.Entity;

adicionar: import javax.persistence.Entity;

[]'s

Criado 20 de dezembro de 2010
Ultima resposta 20 de dez. de 2010
Respostas 3
Participantes 2