Iniciando em Hibernate: "Unknown entity" [RESOLVIDO]

19 respostas
rissato

Olá, tentando fazer o Hibernate3 funcionar pela primeira vez e estou empacado no seguinte erro:

org.hibernate.MappingException: Unknown entity: from Tarifa at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFacto ryImpl.java:569) at org.hibernate.impl.SessionImpl.getOuterJoinLoadable(SessionImpl.java: 1337) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1303) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:300) at TarifaDAO.getList(TarifaDAO.java:27) at TesteHib.main(TesteHib.java:11) Press any key to continue...

O mapeamento está ok. A classe DAO da minha classe de teste aparentemente não tem problema. Se alguém souber o que é isso ajuda aí. Obrigado.

19 Respostas

Jair_Rillo_Junior

Você definiu a classe no hibernate.cfg.xml ?

rissato

Arquivo xml apenas o “.hbm.xml”.
Além desse, fiz o arquivo de configuração “hibernate.properties”.
Apenas esses dois.

kissdemon

Como está o seu xml??

Parece não estar encontrando o mapeamento dentro do

rissato
Arquivo Tarifa.hbm.xml
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping.dtd">
<hibernate-mapping>
    <class name="Tarifa" table="tarifa">
        <id name="cod" column="cod" type="int">
            <generator class="assigned"/>
        </id> 
        <property name="valor" type="double"/>
        <property name="dia" type="string"/>
        <property name="horaInicio" type="string"/>
        <property name="horaFim" type="string"/>
        <property name="tipo" type="string"/>
    </class>
</hibernate-mapping>
Jair_Rillo_Junior

Sua classe Tarifa está dentro de algum pacote? Se sim, você tem que definir o caminho completo da classe no arquivo <Nomedaclasse>.hbm.xml dentro da tag class name

Exemplo

<class name="br.com.guj.beans.Tarifa" table.....>

rissato

[quote=ManchesteR]Sua classe Tarifa está dentro de algum pacote? Se sim, você tem que definir o caminho completo da classe no arquivo <Nomedaclasse>.hbm.xml dentro da tag <class name.

Exemplo

><class name="br.com.guj.beans.Tarifa" table.....

nao… nenhuma classe está dentro de pacote algum.

Jair_Rillo_Junior

Como está o seu DAO? na verdade, como você está iniciando o SessionFactory?

Outra coisa, eu aconselho você a usar apenas o arquivo hibernate.cfg.xml ao invés do hibernate.properties e Annotations ao invés dos arquivos .hbm.xml.

rissato
DAO:
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import java.util.List;
import java.util.Properties;
import java.io.FileInputStream;
import java.util.Date;

public class TarifaDAO{
	private SessionFactory factory;
	public TarifaDAO() throws Exception{
		Configuration cfg = new Configuration();
		Properties props = new Properties();
		props.load(new FileInputStream("hibernate.properties"));
		cfg.setProperties(props);
		cfg.addClass(Tarifa.class);
 		factory = cfg.buildSessionFactory();
	}
	public void insert(Tarifa t) throws Exception{
		Session session = factory.openSession();
     	session.save(t);
     	session.flush();
     	session.close();
	}
	public java.util.List getList(String condicao) throws Exception{
		Session session = factory.openSession();
		Criteria select = session.createCriteria(condicao);
		List tarifas = select.list();
		session.flush();
		session.close();
		return tarifas;
	}
	public Tarifa retrieve(int pk) throws Exception{
		Session session = factory.openSession();
		Tarifa t = (Tarifa)session.load(Tarifa.class, pk);
		session.flush();
		session.close();
		return t;
	}
	public void delete(Tarifa t) throws Exception{
		Session session = factory.openSession();
		session.delete(t);
		session.flush();
		session.close();
	}
}

vou dar uma olhada em como usar Annotations. Obrigado.

rissato

colocando as confs do banco no hibernate.cfg.xml o programa não consegue nem conectar ao banco:

<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost/minhaconta</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.pool_size">10</property> <property name="show_sql">true</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <!-- Arquivos de mapeamento --> <mapping resource="Tarifa.hbm.xml" /> </session-factory> </hibernate-configuration>

erro: org.hibernate.HibernateException: database product name cannot be null

Jair_Rillo_Junior

Ola Rissato, seu arquivo hibernate.cfg.xml está errado.

Olha um exemplo certo

&lt?xml version='1.0' encoding='utf-8'?&gt
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate_annotations</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.username">root</property>
        <property name="connection.password">password</property>
        <!-- Mapping -->
        <mapping class="hibernate.beans.Customers"/>        
    </session-factory>   
</hibernate-configuration>

Note que dentro das tags, nao tem hibernate.connnection e sim apenas connection.

Se você for usar Annotations, repara que o modo de iniciar o SessionFactory é diferente, exemplo:

SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
rissato

eu estou tentando configurar o hibernate sem annotations por enquanto. Mas o famoso “unknown entity” insiste em me perturbar. Eu estou adicionando a classe usando “cfg.addClass(Tarifa.class);” e também no arquivo “hibernate.cfg.xml” e nada faz o bendito ser mapeado.

rissato

nos tutorias eu li que o arquivo hibernate.cfg.xml é carregado automaticamente. Isso está certo? Como eu faço pra carregar ele explicitamente. Pq meu palpite é que ele nao está sendo carregado. Obrigado.

M

Qual o nome do seu bean? é apenas Tarifa mesmo?
pergunta besta mas vamo tenta ueh!

flw.

rissato

agora ficou até engraçado: Se eu insiro a linha “cfg.addClass(Tarifa.class);” o erro é o seguinte:

org.hibernate.MappingException: Error reading resource: Tarifa.hbm.xml at org.hibernate.cfg.Configuration.addClass(Configuration.java:471) at TarifaDAO.<init>(TarifaDAO.java:15) at TesteHib.main(TesteHib.java:10) Caused by: org.hibernate.MappingException: duplicate import: Tarifa

Se eu retiro a linha (supondo que a classe Tarifa já foi mapeada) o erro é o seguinte:

org.hibernate.MappingException: Unknown entity: from Tarifa at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFacto ryImpl.java:569) at org.hibernate.impl.SessionImpl.getOuterJoinLoadable(SessionImpl.java: 1337) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1303) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:300) at TarifaDAO.getList(TarifaDAO.java:27) at TesteHib.main(TesteHib.java:11) Press any key to continue...

M

jah tiro o mapeamento do hibernate_cfg.xml pra ve o erro q dá?
digo, deixar apenas o cfg.addClass(Tarifa.class)
ta até engraçado esse erro hehehe.

flw.

rissato
ja testei... se tirar o mapeamento do hibernate.cfg.xml da problema na hora de parsear. o parser sente falta da tag e reclama:
org.hibernate.HibernateException: problem parsing configurationhibernate.cfg.xml

        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1173)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1112)
        at TarifaDAO.<init>(TarifaDAO.java:11)
        at TesteHib.main(TesteHib.java:10)
Caused by: org.hibernate.MappingException: invalid configuration
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1169)
        ... 3 more
Caused by: org.xml.sax.SAXParseException: The content of element type "session-f
actory" is incomplete, it must match "(property*,mapping+,(class-cache|collectio
n-cache|jcs-class-cache|jcs-collection-cache)*)".
rissato

Consegui fazer o hibernate funcionar. O problema era que o arquivo hibernate.cfg.xml precisa ficar na mesma pasta do hibernate3.jar.

jfeliperc

Olá tive o memso problema e resolvi alterando minha classe de entidade;

removi -> import org.hibernate.annotations.Entity;
acrescentei -> import javax.persistence.Entity;

resolveu meu problema…

comedor_de_folhas

jfeliperc …cara, estava com o mesmo problema aqui, e a troca dos imports resolveu tmbm vlws…

Criado 9 de maio de 2007
Ultima resposta 20 de fev. de 2010
Respostas 19
Participantes 6