Hibernate não está gravando dados

4 respostas
Bird89du

boa noite,
estou com um problema,
estava fazendo uns testes de hibernate+annotations e ultilizando o material da Caelum com apoio, banco MySql.
não dá erro em nada, mas depois de inserir o objeto eu verifico no banco e a tabela criada com o hibernate está vazia…
mudei de banco também mas o problema persiste

fiz uma classe para lógica de negócios muito simples:

package persistenciacomhibernate;

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

@Entity
public class Produtos {
	@Id@GeneratedValue
	private int id;
	private String nome;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}

fiz uma classe para gerar a tabela:

package persistenciacomhibernate;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class GeraTabelas {
	public static void main(String[] args) {
		AnnotationConfiguration annotationConfiguration = new AnnotationConfiguration();
		annotationConfiguration.addAnnotatedClass(Produtos.class);
		new SchemaExport(annotationConfiguration).create(true, true);
	}
}

que apresenta o código SQL normalmente

fiz a hibernate factory:

package persistenciacomhibernate;

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

public class HibernateFactory {
	private static SessionFactory factory;
	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Produtos.class);
		factory = cfg.buildSessionFactory();
	}
	public Session getSession() {
		return factory.openSession();
	}
}

e fiz uma classe que salva os objetos

package persistenciacomhibernate;

import org.hibernate.Session;

public class AdicionaProdutos {
	public static void main(String[] args) {

		Session session = new HibernateFactory().getSession();
		Produtos produtos = new Produtos();
		produtos.setNome("nome do produto");

		session.save(produtos);
		System.out.println(produtos.getNome());
		System.out.println("ID do produto: " + produtos.getId());
		session.close();
	}
}

quando insiro ele aparece o nome e id
e cada objeto que insiro ele aparece o id seguinte como esperado mas não grava no banco

não tenho idéia do que seja

se alguém puder me ajudar

agradeço

4 Respostas

Lavieri

sem commitar não salva no banco… ^^

package persistenciacomhibernate;

import org.hibernate.Session;

public class AdicionaProdutos {
	public static void main(String[] args) {

		Session session = new HibernateFactory().getSession();
		Produtos produtos = new Produtos();
		produtos.setNome("nome do produto");

		session.save(produtos);
		//.getTransaction() resgata a tranzação
		//.commit() confirma a tranzação
		session.getTransaction().commit(); //<=== linha q faltava
		//vc tb pode dar roolback() para reverter operações que ainda não foram commitadas
		System.out.println(produtos.getNome());
		System.out.println("ID do produto: " + produtos.getId());
		session.close();
	}
}
Bird89du

obrigado pela dica.

mas quando coloco no meu código essa linha que faltava ele me retorna um erro

Exception in thread main org.hibernate.TransactionException: Transaction not successfully started

at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)

at persistenciacomhibernate.AdicionaProdutos.main(AdicionaProdutos.java:15)
renzonuccitelli

faltou startar a Transaction:

public class AdicionaProdutos {
	public static void main(String[] args) {

		Session session = new HibernateFactory().getSession();
		Produtos produtos = new Produtos();
		produtos.setNome("nome do produto");
                session.getTransaction().start(); //nao me lembro se é start ou begin, em JPA é begin com certeza
		session.save(produtos);
		//.getTransaction() resgata a tranzação
		//.commit() confirma a tranzação
		session.getTransaction().commit(); //<=== linha q faltava
		//vc tb pode dar roolback() para reverter operações que ainda não foram commitadas
		System.out.println(produtos.getNome());
		System.out.println("ID do produto: " + produtos.getId());
		session.close();
	}
}
Lavieri

renzonuccitelli:
faltou startar a Transaction:

//... session.getTransaction().start(); //nao me lembro se é start ou begin, em JPA é begin com certeza //...

é beginTransaction()

session.beginTransaction();

Criado 25 de janeiro de 2009
Ultima resposta 26 de jan. de 2009
Respostas 4
Participantes 3