Hibernate - Dados não são persistidos

9 respostas
antoniopopete

Estou com um problema no hibernate que ele não está persistindo meus objetos na base.
O sysout que ele exibe na tela mostra ele ate obtendo uma nova sequence de um determinado objeto(quando o mesmo tem) mas ele não realiza o insert e não levanta nenhuma exceção.
Aqui o codigo da classe e o hibernate cfg:

private void realizarOperacao(int operacao, Serializable pObject) throws IndadosAplicacaoException {
		Object lObj = pObject.getClass().cast(pObject);
		try {

			Session lSession = getSession();
			// tx = (Transaction) (new InitialContext()).lookup("java:comp/UserTransaction");
			tx = lSession.beginTransaction();
			switch (operacao) {
			case INSERIR:
				lSession.save(lObj);
				break;

			case EDITAR:
				lSession.update(lObj);
				break;

			case EXCLUIR:
				lSession.delete(lObj);
				break;
			}
			tx.commit();
		} catch (Exception exception) {
			tx.rollback();
			throw new IndadosAplicacaoException(exception);
		}
	}
<!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">oracle.jdbc.driver.OracleDriver</property>
		<property name="hibernate.connection.url">jdbc:oracle:thin:@10.0.30.41:1521:DESE</property>
		<property name="hibernate.connection.username">MADEIRADA</property>
		<property name="hibernate.connection.password">MADEIRADADESE</property>

		<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
		<property name="hibernate.connection.datasource">java:/comp/env/jdbc/MadeiradaDS</property>
		<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
		<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>

		<!-- Use the C3P0 connection pool provider -->
		<property name="hibernate.c3p0.min_size">5</property>
		<property name="hibernate.c3p0.max_size">20</property>
		<property name="hibernate.c3p0.timeout">300</property>
		<property name="hibernate.c3p0.max_statements">50</property>
		<property name="hibernate.c3p0.idle_test_period">3000</property>

		<!-- Show and print nice SQL on stdout -->
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>

		<!-- Lista de Classes mapeadas -->

		<mapping class="br.com.indados.madeirada.model.pojos.Resgate"/>
		<mapping class="br.com.indados.madeirada.model.pojos.TimeMadeirada"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Configuracao"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Importacao"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Participante"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Periodo"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Premio"/>
		<mapping class="br.com.indados.madeirada.model.pojos.PremioProduto"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Produto"/>
		<mapping class="br.com.indados.madeirada.model.pojos.Venda"/>

	</session-factory>
</hibernate-configura

O projeto está rodando no JBoss 4.0.5 e uso o java 1.5.
Queria também configurar as transações gerenciadas pelo conteiner por isso postei o hibernate.cfg.
Alguem poderia dar uma luz?

9 Respostas

andreiribas

Pra fazer update, salvar ou deletar com o hibernate você tem que criar uma transação antes.

Transaction tx = session.beginTransaction();
sesion.save(object);
tx.commit();
M

Acho q precisa executar o comando commit!!

Pedrosa

De uma olhada no GenericDAO e DAOFactory pode te ajudar muito, esses switch são muito feios, esse material esta na apostila da caelum:

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;
	}

	public void adiciona(T u) {
		session.save(u);
	}

	public void remove(T u) {
		session.delete(u);
	}

	public void atualiza(T u) {
		session.merge(u);
	}

	@SuppressWarnings("unchecked")
	public List<T> listaTudo() {
		return session.createCriteria(this.classe).list();
	}

	@SuppressWarnings("unchecked")
	public T procura(Long id) {
		return (T) session.load(this.classe, id);
	}
}
public class DaoFactory {

	private final Session session;

	private Transaction transaction;

	public DaoFactory() {
		session = HibernateUtil.getSession();
	}

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

	public void commit() {
		transaction.commit();
		transaction = null;
	}

	public boolean hasTransaction() {
		return transaction != null;
	}

	public void rollback() {
		transaction.rollback();
		transaction = null;
	}

	public void close() {
		session.close();
	}

	public Dao<Usuario> getUsuarioDao() {
		return new Dao<Usuario>(session, Usuario.class);
	}

	public Dao<Cd> getCdDao() {
		return new Dao<Cd>(this.session, Cd.class);
	}

	public Dao<Musica> getMusicaDao() {
		return new Dao<Musica>(this.session, Musica.class);
	}
}

Usando:

public class CdLogic {

	private DaoFactory daoFactory;

	private Cd cd;

	private List<Cd> cds;

	public CdLogic(DaoFactory daoFactory) {
		this.daoFactory = daoFactory;
	}

	/* Formulário para adição */
	public void formulario() {
	}

	/* Adiciona um cd novo ou atualiza se for edicao */
	public void armazena(Cd cd) {
		daoFactory.beginTransaction();
		daoFactory.getCdDao().atualiza(cd);
		daoFactory.commit();
	}

	/* Remove um cd */
	public void remove(Cd cd) {
		daoFactory.beginTransaction();
		daoFactory.getCdDao().remove(cd);
		daoFactory.commit();
	}

	/* Lista todos os cds */
	public void lista() {
		cds = daoFactory.getCdDao().listaTudo();
	}

	/* Formulário para edição */
	public void editar(Cd cd) {
		/* Carrega os dados no banco para edição */
		this.cd = daoFactory.getCdDao().procura(cd.getId());
	}

Queria usar em meus projetos e não posso!

antoniopopete

Eu abri a transação e dei o comit.
Minha transaction estou usando org.hibernate.Transaction.
Obtendo ela atraves do beginTransaction da session que obtenho com openSession();
E dou comitt.
Acho que não tem a ver com o padrão estando legal ou não ,queria dar uma solução porque os dados não estão sendo persistidos.
Só queria entender o porque.
Estou executando o projeto em um ambiente j2ee.

nicholas.bittencourt

Cara…

Ja aconteceu comigo uma coisa parecida uma vez e, quando fui pesquisar, o erro acontecia porque o Hibernate dropava a minha base entre uma subida e outra do site. Assim, o que eu achava que era o registro nao sendo persistido, era a base sendo dropada. Verifica isso nas suas configuracoes.

antoniopopete

Não o problema não é esse.
Estou usando um DAO (gostei do DAOGEneric e pretendo fazer um refactoring em minha arquitetura).Mas eu gostaria de saber porque ele nem tenta persistir.
Debuguei o session ñão esta nulo,muito menos a Transaction,abro transação e realizo o commit,mas não funciona.
ALgume ja passou por isso?Olhei na base de dados e ela permanece inalterada, nem imprime o sql de atualização da base de dados.

peerless

Este tópico é uma Aula de hibernate para iniciantes. Vale favoritar, se você pretende estudar hibernate! :wink:

Ismaels

Antonio,

Recentemente eu tive um problema parecido usando JPA. Eu não entendo muito bem de Hibernate mas acho que o problema é que falta dar um “flush”, com a JPA isso resolveu, eu usei um entityManager.flush(). É como escrever em um arquivo usando um BufferedWrite, é ele quem decide quando realmente escrever a menos que você force isso ;D
Abraço.

antoniopopete

Ismael eu não entendo mas debugando eu descobri que o hibernate que não estava conseguindo navegar entre as propriedades de meu objeto.
Tenho a seguinte situação:

enho um objeto TimeMadeirada que tem como pk TimeMadeiradaPK que é formado por um objeto Produto que tem como atributos codigo,codgioEmpresa e descricao,certo?Na tabela timemadeirada os unicos atributos de produto são codigo e codigoEmpresa…descrição obtenho atraves de um join ,certo?
Mas o hibernate não está enxergando esse join apenas com createCriteria(“pk.produto.descricao”)
e está me dizendo que TimeMadeirada nao possui descriçãio e realmente não existe,mas achei que o createCriteria funcionasse como um inner join entre as tabelas envolvidas.
Alguem sabe o por que disso?

Criado 24 de agosto de 2007
Ultima resposta 27 de ago. de 2007
Respostas 9
Participantes 7