Hibernate não salva e não dá erro

10 respostas
C

Blz pessoal, estou com um problema que não estou conseguindo resolver
Estou usando hibernate 3 com hsqldb.
Quando eu subo a aplicação e mando salvar ele simplesmente não salva e tb não dá erro.
No console aparece o seguinte:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Usuario (id, conta, cpf, data, nome, numero) values (null, ?, ?, ?, ?, ?)
Hibernate: call identity()

estou usando o hsqldb in memory

alguém sabe o pq disso??

10 Respostas

J

Coloca a tua classe Usuario pra podermos dar uma olhadinha.

E coloca o trecho de código onde mandas salvar… estás dando o commit?

C

segue a classe usuario

package br.vo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity 
public class Usuario implements Serializable {

	@Id 
	@GeneratedValue 
	private Long id;
	
	@Column(name = "nome")   
	private String nome;
	
	@Column(name = "cpf")
	private Integer cpf;
	
	@Column(name = "conta")
	private Double conta;
	
	@Column(name = "numero")
	private Float numero;
	
	@Column(name = "data")
	private Date data;
	
	@Transient
	private ArrayList<Usuario> list;
	
	public Usuario(){}
	
	public Integer getCpf() {
		return cpf;
	}

	public void setCpf(Integer cpf) {
		this.cpf = cpf;
	}

	public Double getConta() {
		return conta;
	}

	public void setConta(Double conta) {
		this.conta = conta;
	}

	public Float getNumero() {
		return numero;
	}

	public void setNumero(Float numero) {
		this.numero = numero;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	public ArrayList<Usuario> getList() {
		return list;
	}

	public void setList(ArrayList<Usuario> list) {
		this.list = list;
	}

segue o método q faz o commit

public void commit() {
		if (transaction != null) {
			if(transaction.isActive()){
				try {
					session.flush();
					transaction.commit();
				} catch (Exception e) {
					e.printStackTrace();
					transaction.rollback();
					sessionFactory.close();
				} finally {
					session.close();
				}
			}
		}
	}
J

Tá faltando como o ID será gerado… se será auto-increment, ou se terás uma sequence própria…

não sei o valor padrão que o @GeneratedValue assume

coloca o @GeneratedValue assim e vê se funciona

@Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 private Long id;
J

joca_java:
Tá faltando como o ID será gerado… se será auto-increment, ou se terás uma sequence própria…

não sei o valor padrão que o @GeneratedValue assume

coloca o @GeneratedValue assim e vê se funciona

@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id;

Lembrando que desta forma, o valor do ID, será auto-incrementado.

Existem varias outras!

[]´s

C

eu fiz oq vc falou mas deu a mesma coisa, eu estava vendo no meu hibernate.cfg.xml e lá tinha duas linhas que eu achoq não precisa

<property name="hibernate.hbm2ddl.auto">update</property> 
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

daí agora o erro mudou

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Usuario (id, conta, cpf, data, nome, numero) values (null, ?, ?, ?, ?, ?)
org.hibernate.exception.SQLGrammarException: could not insert: [br.vo.Usuario]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:40)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
	at br.home.UsuarioHome.save(UsuarioHome.java:32)
	at br.process.UsuarioProcess.usuarioBean(UsuarioProcess.java:17)
	at br.security.SegurancaControllerImpl.usuarioBean(SegurancaControllerImpl.java:13)
	at br.view.controller.MainPrincipalViewController.usuarioBean(MainPrincipalViewController.java:15)
	at br.view.MainPrincipal.main(MainPrincipal.java:20)
Caused by: java.sql.SQLException: Table not found in statement [insert into Usuario (id, conta, cpf, data, nome, numero) values (null, ?, ?, ?, ?, ?)]
	at org.hsqldb.jdbc.Util.throwError(Unknown Source)
	at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
	at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
	at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94)
	at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:30)
	... 20 more

estou procurando o pq ele não encontra a tabela

R

Isso já aconteceu comigo quando eu esqueci de startar e dar o commit na Transaction, dá uma olhada pra ver se não é isso.

C

eu fiz uma dao generica, acessando essa classe

package br.hibernate;

import org.hibernate.MappingException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

public class SessionController {

	private SessionFactory sessionFactory;

	private Transaction transaction;

	protected Session session;

	private SessionFactory getSessionFactory() throws MappingException {
		if (sessionFactory == null)
			sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
		return sessionFactory;
	}

	public void begin() {
		session = getSessionFactory().openSession();
		transaction = session.beginTransaction();
		transaction.begin();
	}

	public void commit() {
		if (transaction != null) {
			if(transaction.isActive()){
				try {
					session.flush();
					transaction.commit();
				} catch (Exception e) {
					e.printStackTrace();
					transaction.rollback();
					sessionFactory.close();
				} finally {
					session.close();
				}
			}
		}
	}
}
J

Hum… tá dando um TableNotFound…

Se não criou as tabelas, troca o código

<property name="hibernate.hbm2ddl.auto">update</property>

por

<property name="hibernate.hbm2ddl.auto">create</property>
J

joca_java:
Hum… tá dando um TableNotFound…

Se não criou as tabelas, troca o código

<property name="hibernate.hbm2ddl.auto">update</property>

por

<property name="hibernate.hbm2ddl.auto">create</property>

Coloca na declaração da tua entidade também, a tabela que a classe Usuario será salva

@Entity   
 @Table(name="USUARIO") // nome da tabela
 public class Usuario implements Serializable {
C

nada ainda, fiz tudo oq vcs pediram e mais outras coisas e nada, até dei um SHUTDOWN no final quando dá um .close(), mas mesmo assim continua a mesma coisa :roll:

Criado 27 de janeiro de 2009
Ultima resposta 27 de jan. de 2009
Respostas 10
Participantes 3