Erro no Hibernate

Galera quando a minha classe responsável por criar a sessão com o hibernate não consegue encontrar o meu arquivo hibernate.cfg.xml, oq devo fazer, eu já coloquei este arquivo no classpath e não deu certo tb.

Abraços._

tenta colocar o “hibernate.cfg.xml” na raiz da sua aplicação, ou seja logo em baixo da pasta “src” se usa Eclipse, ou no pacote “default” se usa Netbeans.
Você pode também configurar a sua “SessionFactory” no código mesmo, escrevendo uma classe “configuradora” assim:

/** Instância da sessionFactory. */
private static SessionFactory sessionFactory;

/**

  • Retorna a sessionFactory.
    */
    public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
    try {
    // Pega as propriedades do Hibernate
    Properties props = getHibernateProperties();
    Configuration cfg = new Configuration();

            Class a = Class.forName("PrimeiraClasse);
            cfg.addClass(a);
    
            Class b = Class.forName("SegundaClasse);
            cfg.addClass(b);
    
            // Mesma coisa com as outras classes.
      
            cfg.setProperties(props);
            sessionFactory = cfg.buildSessionFactory();
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    return sessionFactory;
    

}

/**
 * Cria e retorna as propriedades de configuração do Hibernate.
 */
private static Properties getHibernateProperties() {
    Properties properties = new Properties();
    
    properties.setProperty("hibernate.connection.driver_class",
            "driver"/* SEU DRIVER AQUI */);
    properties.setProperty("hibernate.connection.url",
            "url" /* SEU URL AQUI */);
    properties.setProperty("hibernate.dialect",
            "dialeto" /* SEU DIALETO AQUI */);
    properties.setProperty("hibernate.connection.username",
            " " /* SEU USUARIO QUE ACESSA DB AQUI */);
    properties.setProperty("hibernate.connection.password",
            " " /* SUA SENHA DE ACESSO AO DB AQUI */);
    
    return properties;
}

Acho que assim funciona. Pode até colocar as classes em um arquivo de texto, ou XML, e carregá-las lendo esse arquivo. Mesma coisa para os dados de configuração de url, usaário, senha e dialeto para acessar o banco de dados.
Espero que ajude.

Olá patrizio td bem,

Então eu estou usando o netbeans e coloquei o meu hibernate.cfg.xml no pacote default do netbeans e continuou apresentando o mesmo erro.Criei uma classe configuradora = a sua, mas só que ele está dando este erro :
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
org.hibernate.MappingNotFoundException: resource: hibernate/Cliente.hbm.xml not found
at org.hibernate.cfg.Configuration.addClass(Configuration.java:538)
at Teste2.getSessionFactory(Teste2.java:34)
at Teste2.main(Teste2.java:73)
Exception in thread “main” java.lang.NullPointerException
at Teste2.main(Teste2.java:73)

Acredito q esta classe não está achando o meu mapeamento para a classe cliente.Como eu devo informar este mapeamento a está classe configuradora.

Abraços e muito obrigado pela ajuda._

Eu também tenho o seguinte erro, pois ainda não aprendi como configurar o tal de log4j:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly.

Vamos ver este outro erro:

org.hibernate.MappingNotFoundException: resource: hibernate/Cliente.hbm.xml not found 

eu acho que você tem uma classe Cliente.java no pacote hibernate. Quando o método para crear a SessionFactory faz a inclusão das classes a serem mapeadas, o Hibernate verifica o mapeamento procurando o arquivo XML de mapeamento (no seu caso, Cliente.hbm.xml), que deveria ficar no mesmo pacote da classe Cliente.java
Talvez você não tenha esse arquivo no pacote. Classe (arquivo .java) e arquivo de mapeamento (arquivo .hbm.xml) devem ficar no mesmo pacote, a não ser que especifique um percurso diferente no mesmo xml.

PS eu também uso netbeans, e dava o mesmo erro seu, usando o arquivo hibernate.cfg.xml
Não lembro se e como resolvi, mas de fato passei usar a classe configuradora.

Estou anexando uma imagem da estrutura dos meus pacotes na aplicação Hibernate que estou escrevendo.


A pergunta pode ser besta , mas vc adicionou o log4.jar na sua aplicação ?

[quote=patrizio.cannoni]Eu também tenho o seguinte erro, pois ainda não aprendi como configurar o tal de log4j:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly.

Vamos ver este outro erro:

org.hibernate.MappingNotFoundException: resource: hibernate/Cliente.hbm.xml not found 

eu acho que você tem uma classe Cliente.java no pacote hibernate. Quando o método para crear a SessionFactory faz a inclusão das classes a serem mapeadas, o Hibernate verifica o mapeamento procurando o arquivo XML de mapeamento (no seu caso, Cliente.hbm.xml), que deveria ficar no mesmo pacote da classe Cliente.java
Talvez você não tenha esse arquivo no pacote. Classe (arquivo .java) e arquivo de mapeamento (arquivo .hbm.xml) devem ficar no mesmo pacote, a não ser que especifique um percurso diferente no mesmo xml.

PS eu também uso netbeans, e dava o mesmo erro seu, usando o arquivo hibernate.cfg.xml
Não lembro se e como resolvi, mas de fato passei usar a classe configuradora.

Estou anexando uma imagem da estrutura dos meus pacotes na aplicação Hibernate que estou escrevendo.

[/quote]

Sim, pois sem o jar do log4j no classpath nem aparece aquele WARNING que não está configurado. Simplesmente da um erro de runtime.
Porém, o warning do log4j devido a falta de configuração do mesmo, não tem muito a ver com o erro de mapeamento que acontece com o anderline

Patrizio o pior q meu cliente.hbm.xml está no mesmo pacote q minha classe Cliente, cara será q não ser algum erro na versão do hibernate q eu baixei, qdo vc configurou os jars dele no seu netbeans vc adicionou eles ao seu CLASSPATH tb.

Abraços._


Adicionei os jars do hibernate como na imagem que estou anexando.
Os jars marcados em vermelho são o que o Hibernate usa. Os outros não tem nada a ver.
Cara, a versão que eu baixei do site foi a 3.1, se não me engano.
Putz, aqui vai que é uma maravilha.
Tenta postar o arquivo cliente.hbm.xml


Olá patrizio, vou postar e colocar como arquivo a minha classe cliente, a classe que cria a sessão e o mapeamento.
Abraços.
//Classe que cria a sessão

package hibernate;

import java.util.Properties;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class Teste2{

/** Instância da sessionFactory. */
private static SessionFactory sessionFactory;

/**

  • Retorna a sessionFactory.
    */
    public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
    try {
    // Pega as propriedades do Hibernate
    Properties props = getHibernateProperties();

Configuration cfg = new Configuration();

Class a = Class.forName(“hibernate.Cliente”);
cfg.addClass(a);

//Class b = Class.forName("");
//cfg.addClass(b);

// Mesma coisa com as outras classes.

cfg.setProperties(props);

sessionFactory = cfg.buildSessionFactory();

} catch (Exception ex) {
ex.printStackTrace();
}
}

return sessionFactory;
}

/**

  • Cria e retorna as propriedades de configuração do Hibernate.
    */
    private static Properties getHibernateProperties() {
    Properties properties = new Properties();

properties.setProperty(“hibernate.connection.driver_class”,
“com.mysql.jdbc.Driver”/* SEU DRIVER AQUI /);
properties.setProperty(“hibernate.connection.url”,
“jdbc:mysql://localhost/hibernate” /
SEU URL AQUI /);
properties.setProperty(“hibernate.dialect”,
“org.hibernate.dialect.MySQLDialect” /
SEU DIALETO AQUI /);
properties.setProperty(“hibernate.connection.username”,
"root " /
SEU USUARIO QUE ACESSA DB AQUI /);
properties.setProperty(“hibernate.connection.password”,
" " /
SUA SENHA DE ACESSO AO DB AQUI */);
//properties.setProperty(“mapping”,“resource = cliente.hbm.xml”);
return properties;
}
public static void main(String args[]){
Teste2 t = new Teste2();
Session s = t.getSessionFactory().openSession();

}

}

//Classe Cliente

package hibernate;
/*

  • Cliente.java
  • Created on 14 de Outubro de 2006, 15:04
  • To change this template, choose Tools | Template Manager
  • and open the template in the editor.
    */

/**
*

  • @author anderline
    /
    public class Cliente {
    private String nome;
    private String endereco;
    /
    * Creates a new instance of Cliente */
    public Cliente() {
    }

    public String getNome() {
    return nome;
    }

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

    public String getEndereco() {
    return endereco;
    }

    public void setEndereco(String endereco) {
    this.endereco = endereco;
    }

}

//Mapeamento da classe Cliente

Lembrando que todos os arquivos estão no pacote hibernate.

Então o ideal seria vc tentar executar elas aí no seu ambiente, pois ele já está configurado.

Abraços.

Bom minha estrutura está assim , segue a imagem em anexo
Está funcionado corretamente !
Meu hibernate.cfg.xml:

<?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>
    <!-- Database connection settings -->
      <property name="connection.driver_class">sun.jdbc.odbc.JdbcOdbcDriver</property>
      <property name="connection.url">jdbc:odbc:hibernate</property>
      <property name="connection.username">sa</property>
      <property name="connection.password"></property>
    <!-- JDBC connection pool (use the built-in) -->
      <property name="connection.pool_size">1</property>
    <!-- SQL dialect -->
      <property name="dialect">br.dao.Dialect.MSAccessDialect</property>
    <!-- Echo all executed SQL to stdout -->
      <property name="show_sql">true</property>
    <!-- Drop and re-create the database schema on startup -->
     <!-- <property name="hbm2ddl.auto">create</property> -->
      <mapping resource="mapeamento/Event.hbm.xml"/>
      <mapping resource="mapeamento/Pessoa.hbm.xml"/>
      <mapping resource="mapeamento/Palestra.hbm.xml"/>
      <mapping resource="mapeamento/EventoPessoa.hbm.xml"/>
      <mapping resource="mapeamento/PalestraPessoa.hbm.xml"/>
      <mapping resource="mapeamento/Email.hbm.xml"/>
      <mapping resource="mapeamento/Telefone.hbm.xml"/>
      
  </session-factory>
</hibernate-configuration>


Ok, seu código funciona comigo, mas fiz umas pequenas alterações:

  1. No mapemento xml coloquei o codigo cliente como “native”, pois eu defini a chave primária da tabela cliente como “AUTO_INCREMENT”.
  2. Na classe cliente adicionei uma propriedade codigotipo int , e no mapeamento defini ela como int também.

Peguei assim os arquivos, copiei em um novo projeto no pacote hibernate, importei todos os jars come na postei anteriormente, et voilá … funciona. Fiz a inserção de um cliente no meu banco MySQL (versão 5)

Em anexo seus arquivos modificados.

Abraço

PS se quiser usar o arquivo de configuração hibernate.cfg.xml, mova ele fora do pacote hibernate. Eu vi na imagem que você postou que o xml está dentro do pacote hibernate. Mova ele pra baixo (default package), e acho que vai funcionar com o arquivo xml também. btw, eu prefiro usar a classe configuradora.

E aí Patrizio blz,

Putz cara já estou quase desistindo, movi o meu cliente.hbm.xml e meu Cliente.java para o default package e continua apresentando o mesmo erro, o hibernate não consegue carregar ou achar o meu cliente.hbm.xml.

Cara eu estou usando a versão 3.2, será q pode ser isso ?._

Abraços._

Cara tenta colocar no teu mapeamento no hbm.xml algo do tipo:

E o mesmo p o endereco!

Espero ter ajudado!
Abraço!

Cara para postar códigos coloque entre as tags [ code] e [ /code] para ficar identado

sobre o hibernate porque você não usa Annotations? acho muito mais simples, porque você escreve nas Classes direto sem precisar de xml,(só funciona depois da 1.5)

Exemplo

public class Pessoa(){ public String nome; }
Mapeando o nome com Xml

<property name="nome" type="java.lang.String" column="nome" not-null="true" />
Mapeando o nome com Annotations(MEsma classe Pessoa)

@Entity public class Pessoa(){ @Column(name="nome", nullable="false") public String nome; }
Mas se você procurar na internet você vai achar mais exemplos

Cara, eu tava com o mesmo pau aqui e li seu tópico. Não consegui, ai testei uma coisa simples e funcionou! Olha só:
no meu cfg.xml estava assim

 <mapping resource="controller.Usuario.hbm.xml"/>

eu alterei para

 <mapping resource="Usuario.hbm.xml"/>

E funcionou! Tenta ae! Qm sabe! =)

E tem outra, o cfg.xml está na pasta default!