Problema Hibernate FJ28

9 respostas
wagne23

Boa noite, estou estudando hibernate pela apostila da caelum FJ28, mas não estou conseguindo persistir o meu objeto. Acho que a maioria ja deu uma lida nessa apostila, então eu vou ser direto. Ela inicia bem simples com a configuração do hibernate, criação da classe Usuario e TestaUsuario. Ate ai tudo bem, ele adicionou certo no banco. Então começa a explicar como funciona com uma classe Dao, faz um exemplo de salvar e listar, que tambem funcionou. Então começa a separar as tarefas criando a classe HibernateUtil e colocando a configuração do hibernate nela e criando um DaoFactory, ai bagunçou tudo, ele não da mensagem de erro, mostra na saida do eclipse a query "insert" pro banco e lista como se tivesse inserido no banco, mas quando vamos verificar não esta la o registro. Alguem teve esse problema ao seguir a apostila??
Segue o meu codigo:

public class TestaUsuario {

	public static void main(String[] args) {
		UsuarioDao dao = new DaoFactory().getUsuario();

		Usuario u = new Usuario();
		u.setLogin("admin");
		u.setSenha("admin");

		dao.adiciona(u);

		List<Usuario> lista = dao.ListaTudo();
		for (Usuario usuario : lista) {
			System.out.println(usuario.getLogin());
		}
	}
}
public class DaoFactory {

	private final Session session;
	private Transaction transaction;
	
	public DaoFactory(){
		session = HibernateUtil.getSession();
	}
	
	public void beginTransaction(){
		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 UsuarioDao getUsuario(){
		return new UsuarioDao(this.session);
	}
}
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);
	}

}
public class HibernateUtil {

	private static SessionFactory factory;

	static {
		Configuration conf = new AnnotationConfiguration();
		conf.configure();
		factory = conf.buildSessionFactory();
	}

	public static Session getSession() {
		return factory.openSession();
	}

}

Toda ajuda sera bem vinda!

9 Respostas

joaosavio

não esquece de chamar dao.commit() depois de dao.beginTransaction() e .adiciona(x)

Abraços

wagne23

Obrigado pela atenção joaosavio, mas ainda nao consegui, porque quando eu instancio UsuarioDao dao = new DaoFactory().getUsuario(); eu tenho acesso somente aos metodos da classe UsuarioDao e não sei como usar o commit que esta na classe DaoFactory. Desculpe a ignorancia, mas ta dificil mesmo.

Weslley

qual o erro ocorre ? manda o teu xml

wagne23
Como eu disse acima, não da erro nenhum, ate veja na saida do eclipse a query sendo "executada" mas quando eu olho no banco de dados não esta lá. segue o 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>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">123</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/lojahibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		<mapping class="loja.Usuario"/>
    </session-factory>
</hibernate-configuration>

Desde ja agradeço a ajuda.

Weslley

[color=blue]public class TestaUsuario {

public static void main(String[] args) {   
    DaoFactory fct = new DaoFactory();
UsuarioDao dao = fct.getUsuario();

    Usuario u = new Usuario();   
    u.setLogin("admin");   
    u.setSenha("admin");   

fct.beginTransaction();
    
dao.adiciona(u);   

    List<Usuario> lista = dao.ListaTudo();   
    for (Usuario usuario : lista) {   
        System.out.println(usuario.getLogin());   
    }   

fct.commit();
fct.close();
}

}

Não tive como testar… mas ve se lhe ajuda em algo…

Sds…
[/color]

Weslley

qualquer coisa, mude o seu dialeto do XML para

org.hibernate.dialect.MySQLDialect

joaosavio

numa aplicacao minha fica assim

DAOFactory dao = new DAOFactory();
UsuarioDAO usuarioDAO = dao.getUsuarioDAO();

aí se fosse atualizar um usuario:

UsuarioVO usuarioVO = new UsuarioVO(); // classe com sets e gets
usuarioVO.setLogin("adm");
usuarioVO.setSenha("adm");

dao.beginTransaction();
usuarioDAO.atualiza(usuarioVO);    
dao.commit();

Qualquer duvida posta aí

Weslley

[color=blue]kkkkkkkkk

o joaosavio simplesmente reforço o q eu tinha feito acima :smiley:

Sds…[/color]

joaosavio

vich cara nem vi q vc ja tinha respondido euhauhuhaa

Abraços

Criado 29 de julho de 2008
Ultima resposta 1 de ago. de 2008
Respostas 9
Participantes 3