Hibernate, erro ao tentar acessar banco

22 respostas
D

Estou iniciando os estudos com o Hibernate e peguei um exemplo pronto da Caelum, o arquivo hibernate.properties eu coloco dentro da pasta src do projeto?
Quando eu executo a main ele dá esse erro, já coloquei todas as bibliotecas no projeto, Core, Annotations, EntityManager, Validator, alguém sabe no que eu to errando.

Obrigado!

run:

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.

SLF4J: See <a href="http://www.slf4j.org/codes.html#StaticLoggerBinder">http://www.slf4j.org/codes.html#StaticLoggerBinder</a> for further details.

Exception in thread “main” java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223)

at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)

at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)

at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)

at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)

at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255)

at org.hibernate.cfg.Configuration.(Configuration.java:152)

at br.com.caelum.hibernate.HibernateUtil.(HibernateUtil.java:10)

at br.com.caelum.hibernate.AdicionaProduto.main(AdicionaProduto.java:15)

Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

… 9 more

Java Result: 1

CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

22 Respostas

T

Acho que vc se encaixa neste mesmo caso http://www.guj.com.br/posts/list/142568.java

G

Conforme eu comentei em outro tópico http://www.guj.com.br/posts/preList/139540/751117.java#751117

[i]Esse erro que você está tendo indica que não foi encontrada a classe org/slf4j/impl/StaticLoggerBinder e que você deve visitar o site do SLF4J para mais informações.

O Hibernate usa uma façade para logging e não mais diretamente a implementação. Então vocẽ deve escolher qual implementação de logging usar, sendo o log4j o mais usado. Então no site do SLF4J vocẽ pode ter mais informações e os links para download da implementação de logging que vocẽ quer usar, além de um conector para o mesmo.

http://www.slf4j.org/codes.html#StaticLoggerBinder[/i]

E neste aqui http://www.guj.com.br/posts/preList/139540/751224.java#751224

Para você entender melhor, o slf4j funciona como uma abstração do logging. Assim você precisa não apenas da implementação (log4j no seu caso), mas também de um conector entre ambos. Nesse caso baixe o zip do slf4j (http://www.slf4j.org/download.html), descompacte e coloque o slf4j-log4j12-1.5.8.jar no seu classpath.

D

Fiz o que vcs disseram mas agora está dando esse erro.

Exception in thread main java.lang.NoClassDefFoundError: org/apache/log4j/Level

at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223)

at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)

at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)

at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)

at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)

at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255)

at org.hibernate.cfg.Configuration.(Configuration.java:152)

at br.com.caelum.hibernate.HibernateUtil.(HibernateUtil.java:10)

at br.com.caelum.hibernate.AdicionaProduto.main(AdicionaProduto.java:15)

Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Level

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

 9 more
G

Você precisa do log4j tambem.

D

O meu arquivo hibernate.properties está dentro da pasta src do projeto e as configurações dele está assim:
Tá dando trabalho esse Hibernate, espero que valha a pena. :D

## MySQL

hibernate.dialect org.hibernate.dialect.MySQLDialect
hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username root
hibernate.connection.password 3299
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.ExceptionInInitializerError
	at AdicionaPessoa.main(AdicionaPessoa.java:9)
Caused by: org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection avalable
	at org.hibernate.dialect.resolver.DialectFactory.buildDialect(DialectFactory.java:107)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:138)
	at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2119)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2115)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1339)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
	at HibernateUtil.<clinit>(HibernateUtil.java:9)
	... 1 more
G

douglastc, você tem que ler as mensagens de log, elas de dizem qual é o erro.

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

Você não inicializou o log4j, trocando em miúdos, você precisa de um arquivo log4j.properties dentro do src do seu projeto com as configurações. O hibernate vem com um de exemplo.

J

Douglas,

No caso do seu hibernate.properties, talvez no post tenha faltado o sinal de igual (=). Se no seu arquivo está sem o sinal de igual, então coloque em todas as linhas. Outra coisa é: Use apenas 1 dialeto. No seu caso, eu deixaria o primeiro dialeto setado (MySQL).

Garcia: no caso do log4j é apenas um WARNING e não é por causa dele que gerou a exception.

T

Jair Rillo Junior:
Douglas,

No caso do seu hibernate.properties, talvez no post tenha faltado o sinal de igual (=). Se no seu arquivo está sem o sinal de igual, então coloque em todas as linhas. Outra coisa é: Use apenas 1 dialeto. No seu caso, eu deixaria o primeiro dialeto setado (MySQL).

Garcia: no caso do log4j é apenas um WARNING e não é por causa dele que gerou a exception.

So para corrgir, não é necessário colocar = (igual) para delimitar chave de valor em um arquivo properties. Apenas espaço é suficiente.


The key contains all of the characters in the line starting with the first non-white space character and up to, but not including, the first unescaped ‘=’, ‘:’, or white space character other than a line terminator. All of these key termination characters may be included in the key by escaping them with a preceding backslash character; for example,

O warning não causou o erro mas para corrigi-lo faça igual o garcia falou.
O erro é devido ao seu dialeto, tente fazer igual o Jair disse!

D
Jair Rillo Junior:
Douglas,

No caso do seu hibernate.properties, talvez no post tenha faltado o sinal de igual (=). Se no seu arquivo está sem o sinal de igual, então coloque em todas as linhas. Outra coisa é: Use apenas 1 dialeto. No seu caso, eu deixaria o primeiro dialeto setado (MySQL).

Garcia: no caso do log4j é apenas um WARNING e não é por causa dele que gerou a exception.

## MySQL

=hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
=hibernate.connection.driver_class com.mysql.jdbc.Driver
=hibernate.connection.url jdbc:mysql:///test
=hibernate.connection.username root
=hibernate.connection.password 3299

No caso as linhas ficariam assim?

Eu já troquei o acesso pro SQL Server e sempre dá o mesmo erro, será o problema pode estar no arquivo?

R

adicione o jar commons-logging … procure ler as exceções que está dando… quando vc adicionou a api sl4j ele deu falta de outra classe… vai adicionando que uma hora funfa

J

Vivendo e aprendendo :wink:

Douglas, o igual é entre a key e valor da properties

hibernate.dialect=org.hibernate.dialect.MySQLDialect  
hibernate.connection.driver_class=com.mysql.jdbc.Driver  
hibernate.connection.url=jdbc:mysql:///test  
hibernate.connection.username=root  
hibernate.connection.password=3299
G

Jair, mesmo sendo um arquivo .properties o hibernate.properties não usa =, portanto o arquivo do douglastc está corrento.

douglastc, qual o erro que está dando agora? Você corrigiu o problema do log?

D

garcia-jj:
Jair, mesmo sendo um arquivo .properties o hibernate.properties não usa =, portanto o arquivo do douglastc está corrento.

douglastc, qual o erro que está dando agora? Você corrigiu o problema do log?

Eu salvei o log dentro do src, tem que mexer em alguma configuração dele? Pois está aparecendo os mesmo erros.

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" java.lang.ExceptionInInitializerError at AdicionaPessoa.main(AdicionaPessoa.java:9) Caused by: org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection avalable at org.hibernate.dialect.resolver.DialectFactory.buildDialect(DialectFactory.java:107) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:138) at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2119) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2115) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1339) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at HibernateUtil.<clinit>(HibernateUtil.java:9) ... 1 more

G

douglastc, você está certo, o log4j.properties é dentro do src. Mas é estranho ele não estar achando. Você compilou tudo? Ele deveria copiar esse log4j.properties para o diretório classes.

Abraços

T

garcia-jj:
douglastc, você está certo, o log4j.properties é dentro do src. Mas é estranho ele não estar achando. Você compilou tudo? Ele deveria copiar esse log4j.properties para o diretório classes.

Abraços

Gente, o problema sem duvidas não é com o log4j. Aquilo é um WARNING e WARNING não é ERRO. :slight_smile:

Posta novamente seu hibernate.properties poque ele continua errado. Outra coisa posta a classe que você faz o buildSessionFactory para ver se ela esta correta.

O seu hibernate.properties deverá esta mais ou menos assim:

hibernate.dialect = org.hibernate.dialect.MySQLDialect  
   hibernate.connection.driver_class = com.mysql.jdbc.Driver  
   hibernate.connection.url = jdbc:mysql://localhost:3306/meubanco
   hibernate.connection.username = root  
   hibernate.connection.password = 3299
D

garcia-jj:
douglastc, você está certo, o log4j.properties é dentro do src. Mas é estranho ele não estar achando. Você compilou tudo? Ele deveria copiar esse log4j.properties para o diretório classes.

Abraços

Eu salvei os arquivos hibernate.properties e o log4j.properties na pasta lib e os erros mudaram. Agora tá aparecendo isso:

Exception in thread "main" java.lang.ExceptionInInitializerError at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:243) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255) at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:152) at HibernateUtil.<clinit>(HibernateUtil.java:7) at AdicionaPessoa.main(AdicionaPessoa.java:9) Caused by: java.lang.IllegalArgumentException: Malformed \uxxxx encoding. at java.util.Properties.loadConvert(Unknown Source) at java.util.Properties.load0(Unknown Source) at java.util.Properties.load(Unknown Source) at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:433) at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:470) at org.apache.log4j.LogManager.<clinit>(LogManager.java:122) ... 6 more

D
Eliezer Reis:
garcia-jj:
douglastc, você está certo, o log4j.properties é dentro do src. Mas é estranho ele não estar achando. Você compilou tudo? Ele deveria copiar esse log4j.properties para o diretório classes.

Abraços

Gente, o problema sem duvidas não é com o log4j. Aquilo é um WARNING e WARNING não é ERRO. :)

Posta novamente seu hibernate.properties poque ele continua errado. Outra coisa posta a classe que você faz o buildSessionFactory para ver se ela esta correta.

O seu hibernate.properties deverá esta mais ou menos assim:
hibernate.dialect = org.hibernate.dialect.MySQLDialect  
   hibernate.connection.driver_class = com.mysql.jdbc.Driver  
   hibernate.connection.url = jdbc:mysql://localhost:3306/meubanco
   hibernate.connection.username = root  
   hibernate.connection.password = 3299

Eu mudei o meu hibernate.properties como vc falou.
Aqui está o código do SessionFactory

import org.hibernate.*;
import org.hibernate.cfg.*;

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

É claro que não, porém apenas com o logging funcionando conseguiremos saber qual o erro, certo?

douglastc, os arquivos log4j.properties e hibernate.properties precisam estar dentro do seu src. Você usa eclipse? Verifique se ele está mesmo aparecendo na arvore navigator. Compile o projeto (ideal é fazer um clean no projeto via menu Project > Clean all) e depois rodar de novo seu projeto.

Seu hibernate.properties está errado, deve ser assim (sem o =)

hibernate.dialect org.hibernate.dialect.MySQLDialect hibernate.connection.driver_class com.mysql.jdbc.Driver hibernate.connection.url jdbc:mysql://localhost:3306/meubanco hibernate.connection.username root hibernate.connection.password 3299

Abraços

G

douglastc, esqueci... deixa teu log4j aqui? Ou então use esse aqui:

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %1p (%F:%L) - %m
T

É o que eu disse mais acima, isso é um arquivo properties e nao faz diferença ser espaço em branco, igual, ponto e virgula ou dois pontos. Vai dar na mesma.

Ohhhh Doulgas, ta vendo onde tem jdbc:mysql://localhost:3306/meubanco é logico que onde tem meubanco o certo será o colocar o nome do seu banco. Na senha 3299 é logico que vai ter que colocar a senha que você definiu no seu banco. Você está fazendo assim né?

D

Eliezer Reis:
garcia-jj:

Seu hibernate.properties está errado, deve ser assim (sem o =)

hibernate.dialect org.hibernate.dialect.MySQLDialect hibernate.connection.driver_class com.mysql.jdbc.Driver hibernate.connection.url jdbc:mysql://localhost:3306/meubanco hibernate.connection.username root hibernate.connection.password 3299

É o que eu disse mais acima, isso é um arquivo properties e nao faz diferença ser espaço em branco, igual, ponto e virgula ou dois pontos. Vai dar na mesma.

Ohhhh Doulgas, ta vendo onde tem jdbc:mysql://localhost:3306/meubanco é logico que onde tem meubanco o certo será o colocar o nome do seu banco. Na senha 3299 é logico que vai ter que colocar a senha que você definiu no seu banco. Você está fazendo assim né?

Estou sim, o nome do meu banco é test.

T

Já que o problema aparentemente está naquele arquivo hibernate.properties e você está usando Hibernate Annotations faz o seguinte. Deleta o hibernate.properties :twisted:

Dai substitui o bloco estático daquela sua classe HibernateUtil por este abaixo:

private static final SessionFactory sessionFactory;
       
	static {
		try {
			sessionFactory = new AnnotationConfiguration()
				.addPackage("pacote.das.entidades")
				.addAnnotatedClass(Pessoa.class)
				.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
				.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
				.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/meubanco")
				.setProperty("hibernate.connection.username", "root")
				.setProperty("hibernate.connection.password", "3299")
				.buildSessionFactory();
		} catch (Throwable ex) {
			throw new ExceptionInInitializerError(ex);
		}
        }
Criado 26 de outubro de 2009
Ultima resposta 28 de out. de 2009
Respostas 22
Participantes 5