Boa tarde a todos,
estou com um problema no hibernate e como não tenho experiencia nele não sei nem como começar a solução.
Estou estudando a apostila da caelum FJ-21 no capítulo 16 - Hibernate 3.2 só que não estou usando exatamente as mesmas coisas dos exemplos.
Estou usando o Netbeans 6.5 e o SqlServer expression edition 2005.
Criei um novo projeto web e segui a apostila fazendo as devidas adaptações ao meu código.
Acontece que no teste o hibernate executa a pesquisa, mas ele não insere e nem deleta um dado.
Segue o código para inserir um produto:
publicclassAdicionaProduto{publicstaticvoidmain(String[]args){Sessionsession=newHibernatefactory().getSession();Produtop=newProduto();p.setNome("notebook");p.setDescricao("notebook hp dv9000");p.setPreco(3000.0);ProdutoDAOpdao=newProdutoDAO(session);pdao.salva(p);}}
A saída é:
Porém quando abro o banco e listo os dados esse produto não foi inserido.
Não consegui executar o commit, como ficaria o código com ele?
Obrigado pela atenção.
V
Vini_Fernandes
Entao cara, para persistir as informcoes no banco voce tem que incluir seu entity bean no contexto de persistencia do hibernate,isto é, todas as vezes que voce instanciar um novo objeto devera fazer algo como:
Produtoproduto=newProduto();session.persist(produto);//aqui o objeto em estado transiente passa para persistente, isto é, esta no contexto de persistencia do hibernatesession.flush();//aqui voce coloca as dados do contexto em paralelo com os dados do banco
Resumindo, seu metodo salvar deve estar assim:
public void salva (Produto p) {
session.persist(p);
session.flush();
}
Abracao.
M
moacirjava
Experimenta fazer assim…
publicfinalbooleansalvar(Pessoad){try{Sessionsessao=IniciaHibernate.getSession();Transactiontransaction=sessao.beginTransaction();sessao.save(d);transaction.commit();sessao.close();returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}publicfinalbooleanapagar(intcod){try{Sessionsessao=IniciaHibernate.getSession();Transactiontransaction=sessao.beginTransaction();Pessoap=newPessoa();p=(Pessoa)sessao.load(Pessoa.class,cod);sessao.delete(p);transaction.commit();sessao.close();p=null;System.out.println(++excluido+" Registro Apagado!");returntrue;}catch(ObjectNotFoundExceptione){e.printStackTrace();returnfalse;}}
Você tem uma boa apostila ou tutorial de como fazer mapeamento de classes no Hibernate?
J
Jair_Rillo_Junior
Embora você esteja começando com Hibernate, aconselho fortemente você estudar a parte de transaction dele. Isso vai te ajudar a entender o conceito de transação e como trabalhar com transações com o hibernate, seja em ambiente JSE (que é seu exemplo) ou JEE.
Muito obrigado a todos pela atenção.
Com transaction ficou perfeito.
Não tenho, a primeira vez que uso hibernate e segui a apostila FJ-21 da Caelum.
Muito obrigado pela dica. Vou estudar sim.
A
Anderson_Leite
O save() do hibernate não salva coisas no banco. Essa costuma ser a maior dificuldade no uso do hibernate.
Ao chamar o método save você está tornando-o managed(ou persistent), ou seja, agora o hibernate pode gerenciar esse objeto pra você.
Os dados de objetos managed só são atualizados no banco quando a transaction dispara o commit.
Por que funciona com o flush ?
Porque o flush do hibernate serve pra atualizar sua base com todos os objetos que estão no estado managed da sua session.
C
clebiovieira
Anderson Leite:
O save() do hibernate não salva coisas no banco. Essa costuma ser a maior dificuldade no uso do hibernate.
Ao chamar o método save você está tornando-o managed(ou persistent), ou seja, agora o hibernate pode gerenciar esse objeto pra você.
Os dados de objetos managed só são atualizados no banco quando a transaction dispara o commit.
Por que funciona com o flush ?
Porque o flush do hibernate serve pra atualizar sua base com todos os objetos que estão no estado managed da sua session.