Problemas com Hbernate + MySql

4 respostas
P

Galera boa noite, estou inciando meus estudos em Java e Hibernate e já começo me deparando com o seguinte problema:

org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available
	org.hibernate.dialect.resolver.DialectFactory.buildDialect(DialectFactory.java:106)
	org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:152)
	org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2863)
	org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2859)
	org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1870)
	dao.DAOuser.<init>(DAOuser.java:13)
	action.Validar.doPost(Validar.java:47)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Minha classe Usuario é a seguinte:

public class Usuario {
	private String user;
	private String password;
	private int level;
	public int getLevel() {
		return level;
	}
... gets e sets
O mapeamento no Usuario.hbm.xml é:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="model">
	<class name="Usuario" table="user">
		<id name="user" type="string">
			<generator class="assigned" />
		</id>
		<property name="password" column="senha" type="string" />
		<property name="level" type="integer" />
	</class>
</hibernate-mapping>

E as configurações de conexão do Hibernate é:

<?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 name="factory">
        <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="hibernate.connection.password">123</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/locadora</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
    </session-factory>
</hibernate-configuration>

Alguém poderia me mostrar onde esta o erro (Depois de tanto tempo lendo da uma turvada na vista pra achar erros!), valendo lembrar que o driver do mysql esta no seu devido local.

Agradeço desde já!

4 Respostas

wagnerfrancisco

Como está sua classe que inicia a configuração do hibernate?

P
wagnerfrancisco:
Como está sua classe que inicia a configuração do hibernate?

Como eu disse eu sou iniciante e as vezes me enrrolo, mas a classe que incia a configuração do Hibernate seria a hora que eu abro as sessões pra realizar uma consulta? Caso não seja pode ser esse o problema pios as únicas classes que envolvem Hibernate que estão no meu projeto são essas que já postei!

Mas de qualquer maneira vou por aqui como estou abrindo a sessão nas DAO.

import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;

import model.*;

public class DAOuser {
	private SessionFactory factory;
	
	public DAOuser(){
		factory = new Configuration().addClass(Usuario.class).buildSessionFactory();
	}
	
	public void inserirUser(Usuario user) throws Exception {
		Session sessao = factory.openSession();
		sessao.save(user);
		sessao.flush();
		sessao.close();
	}
...
wagnerfrancisco

É essa classe mesmo.

Tente remover o addClass(Usuario.class) e adicionar esta configuração no xml. Me parece que você deve usar ou configuração programática, ou por xml.

Uma dica: o método que você colocou no construtor do DAO deveria estar numa classe separada. Você precisará delas em diversos lugares, não apenas neste DAO (vc não precisa efetuar o setup do hibernate para cada DAO). Procure por HibernateUtil, que é uma das maneiras de isolar esta configuração.

P
wagnerfrancisco:
É essa classe mesmo.

Tente remover o addClass(Usuario.class) e adicionar esta configuração no xml. Me parece que você deve usar ou configuração programática, ou por xml.

Uma dica: o método que você colocou no construtor do DAO deveria estar numa classe separada. Você precisará delas em diversos lugares, não apenas neste DAO (vc não precisa efetuar o setup do hibernate para cada DAO). Procure por HibernateUtil, que é uma das maneiras de isolar esta configuração.

Seguinte, fiz como você disse e pesquisei e criei a HibernateUtil e fiz uma DAO generica passando o objeto e na Util ele faz o procedimento (ainda não testei), porém antes de continuar eu criei uma classe geradora de tabelas:

public class GerarTabela {
	
	public static void main (String [] args){
		
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.addAnnotatedClass(Usuario.class);
		SchemaExport export = new SchemaExport(configuration);
		export.create(true,false);
	}

}
e a classe Usuario ficou assim:
@Entity
public class Usuario {
	@Id
	@GeneratedValue
	private int level;
	@Column
	private String user;
	@Column (length = 16)
	private String password;
...

Criei também a hibernate.properties que esta assim:

hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.password = 22971244
hibernate.connection.url = jdbc:mysql://localhost/locadora
hibernate.connection.username = root
hbernate.show_sql = true
hibernate.hbm2ddl.auto = update
hibernate.connection.charset = UTF-8

Porém quando mando executar a classe GerarTabela da o seguinte retorno:

11:41:22,300 INFO Version:37 ? Hibernate Commons Annotations 3.2.0.Final 11:41:22,311 INFO Environment:603 ? Hibernate 3.6.5.Final 11:41:22,316 INFO Environment:621 ? loaded properties from resource hibernate.properties: {hibernate.connection.driver_class=com.mysql.jdbc.Driver, hibernate.dialect=org.hibernate.dialect.MySQL5Dialect, hibernate.connection.username=root, hbernate.show_sql=true, hibernate.hbm2ddl.auto=update, hibernate.connection.url=jdbc:mysql://localhost/locadora, hibernate.bytecode.use_reflection_optimizer=false, hibernate.connection.password=****, hibernate.connection.charset=UTF-8} 11:41:22,319 INFO Environment:814 ? Bytecode provider name : javassist 11:41:22,322 INFO Environment:695 ? using JDK 1.4 java.sql.Timestamp handling 11:41:22,407 INFO Dialect:135 ? Using dialect: org.hibernate.dialect.MySQL5Dialect 11:41:22,470 INFO AnnotationBinder:532 ? Binding entity from annotated class: model.Usuario 11:41:22,508 INFO EntityBinder:530 ? Bind entity model.Usuario on table Usuario 11:41:22,557 INFO Configuration:1676 ? Hibernate Validator not found: ignoring 11:41:22,566 INFO SchemaExport:234 ? Running hbm2ddl schema export drop table if exists Usuario create table Usuario (level integer not null auto_increment, password varchar(16), user varchar(255), primary key (level)) 11:41:22,566 INFO SchemaExport:281 ? schema export complete

E não cria a tabela, alguma sugestão antes de voltar à duvida inicial? Preferi tentar criar assim porque pode ser que o hibernate não estivesse reconhecendo uma tabela já criada e tal dai eu decidi criar por ele mesmo pra ver se pode resolver, quem sabe.
Eu suspeito que seja algo em torno do dialeto hibernate.dialect = org.hibernate.dialect.MySQL5Dialect pois caso eu apague tudo que vem após essa linha no hibernate.properties ele continua dando o mesmo retorno, porém já tentei diversos tipos de dialeto do mysql e até agora nada!

Criado 28 de agosto de 2012
Ultima resposta 29 de ago. de 2012
Respostas 4
Participantes 2