FJ-28 Problemas na hora de salvar no banco

9 respostas
patbuzzatto

Eu estou estudando a apostila da Caelum FJ-28, e estou usando o postgres.
desde o primeiro TestaUsuario já estava dando errado.
Assim eu criei tudo certo porem, quando ele fala pra salvar Login- “admin” e Senha - “admin” o eclipse dizia que estava tudo certo mas não inseria nada no banco. Mas ele cria a tabela Usuario certinho.
Ae eu tentei arrumar de todas as formas e não funcionou,
então eu continuei a apostila pra ver se dava certo né, criei o HibernateUtil, DaoFactory e a Dao generica,
mas nada funciona ele da isso aqui no console quando eu coloco pra rodar:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate:
select
nextval (‘hibernate_sequence’)
Hibernate:
select
this_.id as id0_0_,
this_.login as login0_0_,
this_.senha as senha0_0_
from
Usuario this_

E continua sem salvar nada no banco. Alguem sabe me ajudar?

9 Respostas

emmanuelrock

Posta o código amigo. De preferências entre as "tags [code]"

patbuzzatto

Desculpa, não tinha postado pq ta igual mesmo a apostila.

Esse o 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.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
		<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgis</property>
		<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
		<property name="hibernate.connection.username">postgres</property>
		<property name="hibernate.connection.password">dsa2010</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">false</property>
		<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

		<mapping class="br.com.caelum.lojavirtual.modelo.Usuario"/>
	</session-factory>
</hibernate-configuration>
A Dao.java:
package br.com.caelum.lojavirtual.dao;

import java.util.List;

import org.hibernate.Session;

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

public class Dao<T> {
	
	private Session session;
	private Class classe;
	
	public Dao(Session session, Class classe) {
		this.session = session;
		this.classe = classe;
	}

	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.update(u);
	}
	
	public List<T> listaTudo(){
		return this.session.createCriteria(this.classe).list();
	}
	
	public T procura(Long id){
		return (T) session.load(this.classe, id);
	}
	

}
e o TestaUsuario.java:
package br.com.caelum.lojavirtual.main;

import java.util.List;

import org.hibernate.Session;

import br.caelum.lojavirtual.util.HibernateUtil;
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 dao = new DaoFactory().getUsuarioDao();
		
		//adiciona um usuario
		Usuario u = new Usuario();
		u.setLogin("admin");
		u.setSenha("senha");
		
		dao.adiciona(u);
		
		//lista usuarios
		List<Usuario> lista = dao.listaTudo();
		for (Usuario usuario : lista){
			System.out.println(usuario.getLogin());
		}
		
	}
}
emmanuelrock

Posta a entidade.

patbuzzatto

Usuario.java

package br.com.caelum.lojavirtual.modelo;

import javax.persistence.*;

@Entity
public class Usuario {
	
	@Id
	@GeneratedValue
	private Long id;
	private String login;
	private String senha;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	
	
}
Tiburcio_Mancha

Para salvar, alterar, e deletar, vc tem que declarar uma transação, se não sua base não irá ser atualizada...

public void adiciona( T t){   
Transaction transaction = session.getTransaction();   
try{   
transaction.begin();   
session.save(t);   
transaction.commit();   
}catch(DaoException de){   
transaction.rollback();   
  
}
emmanuelrock

Experimenta declarar uma sequence por annotation:

@Entity
@Table(name="PESSOA")
public class Pessoa {
	@Id   
	@Column(name="ID", nullable = false) 
	@GeneratedValue(generator = "PESSOASEQ", strategy = GenerationType.SEQUENCE)   
	@SequenceGenerator(name = "PESSOASEQ", sequenceName = "PESSOA_ID_SEQ", allocationSize = 1)
	private Long id;
...
patbuzzatto

Tiburcio_Mancha, querido funcionou! muito obrigada, estava ralando a dias nisso.
teria como me explicar o que foi feito?

Tiburcio_Mancha

Operações de persistência na base com Hibernate é exigido que vc use transação,o que é uma segurança para sua aplicação. Por exemplo, se ocorrer algum problema no escopo da transação, seus dados não são salvos. Imagina no meio da operação de persistencia, ocorre um problema e vc tem um registro salvo de forma errada ou incompleta?

Vc pode realizar um tratamento de excessão com try e catch, onde no fim do trecho do try é declarado o commit da transação. Este comando salva os dados que estão na cash do hibernate depois que foi executado o save na base. No catch vc declara o rollbak, onde se ocorrer a excessão que vc tratou, os dados não são persistidos na base. Vide o código que te passei.

Nãos ei se minha explicação ficou boa, os amigos do Guj podem explicar de uma forma melhor e também na net tem muita coisa explicando transação.

patbuzzatto

entendi sim, muito Obrigada!

Criado 2 de fevereiro de 2011
Ultima resposta 2 de fev. de 2011
Respostas 9
Participantes 3