Utilizando hibernate - Problema com configurações

5 respostas
R

Bom dia gente.

Estou com um problema um pouco estranho ocorrendo com relação às configurações do hibernate, é o seguinte, estou construindo um teste de aplicação usando hibernate-annotations (com spring 2.0 e jboss 4.0.5), ao iniciar a aplicação, no log do Jboss vejo:

...
11:09:47,890 INFO  [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext-dao.xml]
11:09:48,093 INFO  [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext-jdbc.xml]
11:09:48,109 INFO  [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext-service.xml]
...
11:09:48,593 INFO  [DriverManagerDataSource] Loaded JDBC driver: com.mysql.jdbc.Driver
11:09:48,656 INFO  [Version] Hibernate Annotations 3.2.0.GA
11:09:48,718 INFO  [Environment] Hibernate 3.2.2
11:09:48,734 INFO  [Environment] hibernate.properties not found
11:09:48,750 INFO  [Environment] Bytecode provider name : cglib
11:09:48,765 INFO  [Environment] using JDK 1.4 java.sql.Timestamp handling
11:09:49,046 INFO  [Configuration] configuring from url: jndi:/localhost/exemplo/WEB-INF/hibernate.cfg.xml
11:09:49,250 INFO  [AnnotationConfiguration] Mapping package br.com.teste.exemplo.beans
11:09:49,375 WARN  [AnnotationBinder] Package not found or wo package-info.java: br.com.teste.exemplo.beans
11:09:49,484 INFO  [Configuration] Configured SessionFactory: null
11:09:49,500 INFO  [LocalSessionFactoryBean] Building new Hibernate SessionFactory
11:09:49,531 INFO  [AnnotationBinder] Binding entity from annotated class: br.com.teste.exemplo.beans.Usuario
11:09:49,656 INFO  [EntityBinder] Bind entity br.com.teste.exemplo.beans.Usuario on table USUARIO
11:09:50,406 INFO  [ConnectionProviderFactory] Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
11:09:50,687 INFO  [SettingsFactory] RDBMS: MySQL, version: 5.0.27-community-nt
11:09:50,687 INFO  [SettingsFactory] JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.4 ( $Date: 2006-10-19 17:47:48 +0200 (Thu, 19 Oct 2006) $, $Revision: 5908 $ )
11:09:50,750 INFO  [Dialect] Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
...

Aparentemente, as configuração foram carregadas normalmente. Tenho uma classe HibernateUtil (nada de especial na classe, só o padrão mesmo... inclusive acho que peguei o exemplo daqui mesmo), que uso para pegar a sessão. Segue:

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

public class HibernateUtil {

	private static final SessionFactory sessionFactory;

	static {
	        try {

	            sessionFactory = new AnnotationConfiguration().buildSessionFactory();
	        } catch (Throwable ex) {
	            // Log exception!
	            throw new ExceptionInInitializerError(ex);
	        }
    }

	public static Session getSessionFactory()
		throws HibernateException {
	return sessionFactory.openSession();
	}
	
}
Estou criando um DAO genérico, mais ou menos assim:
package org.teste.padrao.dao;

import java.lang.reflect.Field;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.jboss.logging.Logger;

import br.com.teste.exemplo.beans.Usuario;

public class GenericDAO<E>{
	
	private static Logger logger = Logger.getLogger(GenericDAO.class);
	private Class persistenClass;
	private Session session;
	
	public GenericDAO(){}
	
	public GenericDAO(Class class1){
		//this.persistenClass = class1;
		this.persistenClass = Usuario.class;
		this.session = HibernateUtil.getSessionFactory();
	}
	
	/**
	 * Carrega um elemento pelo seu ID
	 * */
	public E loadById(Integer id){
		...
	}
	
	/**
	 * Carrega lista de objetos da classe no banco
	 * */
	@SuppressWarnings("unchecked")
	public List<E> list(){
		persistenClass = Usuario.class; /*testando. remover depois*/
		this.session = HibernateUtil.getSessionFactory(); 
		Field[] classFields = persistenClass.getFields();
		/*Criando critério de busca para a classe*/
		Criteria criterio = session.createCriteria(persistenClass);		
		ProjectionList listaPropriedades = Projections.projectionList();
		for (Field campo : classFields){
			listaPropriedades.add(Projections.property(campo.getName()));
		}
		criterio.setProjection(listaPropriedades);
		return criterio.list();
	}
	...	
}

É... gentileza não reparem um código meio bizarro aí... hehe, to começando a estudar projeções e critérios :lol:

Bom, mas, a questão é que, executando o código, ocorre um erro de que o dialeto não está setado:

11:26:01,687 ERROR [[helpdesk]] Servlet.service() for servlet exemplo threw exception
java.lang.ExceptionInInitializerError
	at org.teste.padrao.dao.HibernateUtil.<clinit>(HibernateUtil.java:18)
...
Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set

O que me deixa confusa, pois, no log aparentemente foram lidas todas as configurações, incluindo o dialeto. Por teste, já tentei remover a chamada HibernateUtil.getSessionFactory() do construtor para o método de listagem, só para ver o que ocorria, mas, a única diferença é a hora em que o erro explode. Ele continua ocorrendo de qq jeito.

Alguém tem noção do por quê esse erro ocorre?

Obrigada.

5 Respostas

Mauricio_Linhares

Você esqueceu de configurar o dialeto do seu banco de dados no Hibernate.

R

Olá Mauricio.

Bom, no meu hibernate.cfg.xml, está assim:
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
  	<!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    
    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>    
...
  </session-factory>
</hibernate-configuration>

E, no log, vejo a mensagem "[Dialect] Using dialect: org.hibernate.dialect.MySQLInnoDBDialect". Se a configuração não foi feita corretamente, presumo que está frase não deveria aparecer, ou que explodisse um erro na hora da leitura da configuração.

Agora, o que realmente não sei é se essa é a única configuração necessária (acredito que sim).

plentz

Ta estranho isso. Teoricamente está tudo certo. Certeza que o xml que você fez deploy é aquele ali?

R

Sim, o arquivo “deployado” é aquele mesmo (removi todos os temporários do jboss para não ter conflito).

Perguntei lá no fórum do hibernate, parece um bug de versão (já corrigido):
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2528

Baixei essa semana os jars mais recentes do hibernate (infelizmente, não tive tempo para olhar isso antes… :frowning: ). Amanhã espero ter tempo para colocar os jars na minha aplicação e testar de novo, para ver o que ocorre…

Funcionando ou não, vou postar aqui o que ocorreu (espero que seja uma resposta positiva, hehehe)

Obrigada!

dipeloco

vc esqueceu de chamar o metodo configure()

Criado 7 de abril de 2007
Ultima resposta 18 de set. de 2007
Respostas 5
Participantes 4