Hibernate não grava no banco

13 respostas
S

Fala galera,

Estou seguindo a apostila loja virtual da Caelum i[/i], e empaquei em um problema com o Hibernate. O projeto até aqui compila, roda direitinho e até dá toda pinta que está gravando os dados no banco, mas o problema é que não grava nada.

Aparece o seguinte na saída (repare que no select solicitado abaixo ele até lista no caso o login e senha salvos no run atual, mas não é gravado nada no banco):

Hibernate: 
    insert 
    into
        Usuario
        (login, senha) 
    values
        (?, ?)
Hibernate: 
    select
        this_.id as id0_0_,
        this_.login as login0_0_,
        this_.senha as senha0_0_ 
    from
        Usuario this_
logAdmin12 - passAdmin12

Caso ajude este é o main, se necessário posto o resto dos fontes:

package br.com.caelum.lojavirtual.main;

import java.util.List;
import br.com.caelum.lojavirtual.dao.DaoFactory;
import br.com.caelum.lojavirtual.dao.Dao;
import br.com.caelum.lojavirtual.modelo.Usuario;

public class TestaUsuario {
	public static void main(String [] args){
		
		Dao<Usuario> dao = new DaoFactory().getUsuarioDao();
		
		Usuario u = new Usuario();
		u.setLogin("logAdmin12");
		u.setSenha("passAdmin12");
		
		dao.adiciona(u);
		
		List<Usuario> lista = dao.listaTudo();
		for(Usuario usuario : lista){
			System.out.println(usuario.getLogin() +" - "+ usuario.getSenha());
		}
		
	}

}

Alguém com mais experiência em Hibernate poderia ajudar?

13 Respostas

surfzera

coloca a sua classe DAOFactory ai por favor…

Jair_Rillo_Junior

Provavelmente é porque você não está fazendo o commit().

Posta o código onde o save() é executado…

S

sakei… acabei não trazendo os fontes para o trampo, assim que chegar em casa eu posto o DAO… até!

H

provavelmente no seu dao deve estar somente com o save(objeto);

só dar um commit(); que funciona.

S

Então… o problema é que mesmo chamando o “commit() : DaoFactory” num rolava. Na apostila não detalha exatamente a chamada ao commit(), então eu estava fazendo assim:

Na classe TestaUsuario:

DaoFactory daof = new DaoFactory();

depois,

daof.beginTrasaction();

dao.adiciona(u);

daof.commit();

Enfim, o DAO está da seguinte forma:

package br.com.caelum.lojavirtual.dao;

import java.util.List;

import org.hibernate.Session;

public class Dao<T> {
	
	private Session session;
	private final Class classe;
	
	public Dao(Session session, Class classe){
		this.session = session;
		this.classe = classe;
	}
	
	protected Session getSession() { 
		return session; 
	} 
	
	public void adiciona(T u){
		this.session.save(u);
	}
	public void remove (T u){
		this.session.delete(u);
	}
	public void atualiza (T u){
		this.session.merge(u);
	}
	public List<T> listaTudo(){
		return this.session.createCriteria(this.classe).list();
	}
}

o DaoFactory, assim:

package br.com.caelum.lojavirtual.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.lojavirtual.modelo.Usuario;
import br.com.caelum.lojavirtual.util.HibernateUtil;

public class DaoFactory {
	
	private final Session session;
	private Transaction transaction;
	
	public DaoFactory(){
		session = HibernateUtil.getSession();
	}
	public void beginTrasaction(){
		this.transaction = this.session.beginTransaction();
	}

	public void commit(){
		this.transaction.commit();
		this.transaction = null;
	}
	
	public boolean hasTransaction(){
		return this.transaction != null;
	}
	
	public void rollback(){
		this.transaction.rollback();
		this.transaction = null;
	}
	
	public void close(){
		this.session.close();
	}
	
	public Dao<Usuario> getUsuarioDao(){
		return new Dao<Usuario>(this.session, Usuario.class);
	}

}

e postando novamente o TestaUsuario com o commit() e tudo:

package br.com.caelum.lojavirtual.main;  
  
import java.util.List;  
import br.com.caelum.lojavirtual.dao.DaoFactory;  
import br.com.caelum.lojavirtual.dao.Dao;  
import br.com.caelum.lojavirtual.modelo.Usuario;  
  
public class TestaUsuario {  
    public static void main(String [] args){  
          
        Usuario u = new Usuario();  
        u.setLogin("logAdmin12");  
        u.setSenha("passAdmin12");  
        
        DaoFactory daof = new DaoFactory();
        Dao<Usuario> dao = new DaoFactory().getUsuarioDao();
        
        daof.beginTrasaction();  
        dao.adiciona(u);
        daof.commit();  
          
        List<Usuario> lista = dao.listaTudo();  
        for(Usuario usuario : lista){  
            System.out.println(usuario.getLogin() +" - "+ usuario.getSenha());  
        }  
          
    }  
  
}
S

alguma idéia?

Marky.Vasconcelos

Deveria funcionar.

S

deveria não é Mark, tb acho cara… que será que ta pegando?

sei que incompatibilidade não é, pois já testei criando classes mais simples, e gravou no banco via hibernate através das mesmas configurações e versões que estou usando agora.

o que mais poderia ser?

Marky.Vasconcelos

Tem certeza que a base esta certa? Roda o SchemaUpdate sem exportar para o banco para ver se ele cria mais alguma tabela.
(execute(true,false):wink:

S

parece que a este respeito está tudo certo Mark... bom resolvi refazer tudo para ver se dessa vez encontro onde possa estar esse erro, mas acabou empacando no mesmo lugar =s

dessa vez fui fazendo backup do projeto conforme fui implementando, e até a parte do processo das classes abaixo, roda e salva no banco, normal. Somente depois quando crio o DaoFactory que começa a dar pau.

TestaUsuario:
package br.com.caelum.lojavirtual.main;

import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.*;
import br.com.caelum.lojavirtual.dao.UsuarioDao;
import br.com.caelum.lojavirtual.modelo.Usuario;


public class TestaUsuario {
	public static void main(String[] args) {
		
		// configura o hibernate
		Configuration conf = new AnnotationConfiguration();
		conf.configure();
		SessionFactory factory = conf.buildSessionFactory();
		Session session = factory.openSession();
		
		// cria um usuario
		Usuario u = new Usuario();
		u.setLogin("admin3");
		u.setSenha("admin3");
		
		UsuarioDao dao = new UsuarioDao(session);
		
		// abre transacao e insere
		Transaction t = session.beginTransaction();
		dao.adiciona(u);
		t.commit();
		
		// lista usuarios
		List<Usuario> lista = dao.listaTudo();
		for (Usuario usuario : lista) {
		System.out.println(usuario.getLogin());
		}
		
		session.close();
	}
}
UsuarioDAO:
package br.com.caelum.lojavirtual.dao;

import java.util.List;
import org.hibernate.*;
import br.com.caelum.lojavirtual.modelo.Usuario;

public class UsuarioDao {
	private Session session;
	
	public UsuarioDao(Session session) {
	this.session = session;
	}
	public void adiciona(Usuario u) {
	this.session.save(u);
	}
	public void remove (Usuario u) {
	this.session.delete(u);
	}
	public void atualiza (Usuario u) {
	this.session.merge(u);
	}
	public List<Usuario> listaTudo() {
	return this.session.createCriteria(Usuario.class).list();
	}
	public Usuario procura(Long id) {
	return (Usuario) session.load(Usuario.class, id);
	}
}

Daí qdo faço a refatoração e crio o DaoFactory que postei anteriormente acontece o mesmo problema: na saída, lista os setLogin() : Usuario que já estão no banco, mais o Usuario que acabei de incluir no TestaUsuario, mas não grava no banco este ultimo (só apresenta a lista mesmo).

S

além do que, a guia “problems” do Eclipse acusa o seguinte problema:

No persistence.xml file found in project | lojavirtual | Unknown | JPA Problem Marker

eu tenho que ter esse persistence.xml no meu META-INF?

S

ainda nem consegui gente… está tudo certo? pq será que não grava?

C

amigo, estava com o mesmo problema, e resolvi ontem a noite ( tive a ideia no banho XD )

Olha como ficou meu Testausuario :

package br.com.caelum.lojavirtual.main;  
  
import java.util.List;  
import br.com.caelum.lojavirtual.dao.DaoFactory;  
import br.com.caelum.lojavirtual.dao.Dao;  
import br.com.caelum.lojavirtual.modelo.Usuario;  
  
public class TestaUsuario {  
    public static void main(String [] args){  
          
        DaoFactory dao = new DaoFactory();  
          
        Usuario u = new Usuario();  
        u.setLogin("logAdmin12");  
        u.setSenha("passAdmin12");  
         
        dao.beginTransaction(); 
        dao.getUsuarioDao().adiciona(u);  
        dao.commit();
          
        List<Usuario> lista = dao.listaTudo();  
        for(Usuario usuario : lista){  
            System.out.println(usuario.getLogin() +" - "+ usuario.getSenha());  
        }  
          
    }  

    dao.close();
  
}

Eu não lembro se é exatamente assim o código ,to no trampo agora, se não funcionar posta ai, que eu coloco o código certo quando chegar em casa.

Flww

Criado 13 de abril de 2009
Ultima resposta 21 de out. de 2009
Respostas 13
Participantes 6