Boa noite,
Amigos, construir meus daos no meu sistema, mas não consegui encontrar uma boa forma de fechar a Session do Hibernate. Não estou usando nenhum framework.
Vejam um exemplo:
package dao;
import infra.CriadorDeSession;
import java.util.List;
import modelo.Account;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class AccountDAO {
Session session;
Transaction tx;
public AccountDAO(){
session=CriadorDeSession.getSession();
tx = session.beginTransaction();
}
public void salva(Account account) {
session.save(account);
tx.commit();
fecha();
}
public void remove(Account account){
session.delete(account);
fecha();
}
public void atualiza(Account account){
session.update(account);
fecha();
}
public Account get(Integer id){
Account account=(Account)session.load(Account.class,id);
fecha();return account;
}
@SuppressWarnings("unchecked")
public List<Account> lista(){
List<Account> list=session.createQuery("from modelo.Account").list();
fecha();return list;
}
public void fecha(){
session.close();
}
}
Percebam que eu criei um método para fechar a Session e sempre que termino um método do DAO chamo esse método.
O problema é que quando vou utilizar o objeto retornado do DAO numa outra classe, é lançada a exceção org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Percebi que caso eu não feche a Session esse erro não ocorre.
Qual a forma mais adequada para eu trabalhar com essa session?
Agradeço
Amigo boa noite , não sei se é a forma mais adequada mais eu faço basicamente assim
public class DaoX {
Session sessao = null;
Transaction tx = null;
public void salvar(Cliente u) {
try {
sessao = HibernateUtil.getSession();
tx = sessao.beginTransaction();
sessao.save(u);
tx.commit();
} catch (Exception ex) {
tx.rollback();
ex.printStackTrace();
} finally {
if (sessao != null) {
try {
sessao.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
Perceba que eu tenho um bloco finally que mesmo que meu hibernateUtil não retorne nada por exemplo , e eu não consiga realizar meu commit
ele vai testar se a sessao é diferente de null e se for ele vai tentar fechar a mesma , acredito que somente o meu bloco que testa a exception que esta muito abstrato
difucultando um pouco a interpretação da exception .
Espero ter ajudado.
Amigo, voce poderia fazer uma classe que gerencia esse controle de transacao, mais na minha opiniao, e nao sou um expert no assunto, vc deveria usar um framework de injecao de dependencia, tipo um spring…, mais e minha opiniao…
Amigo, voce poderia fazer uh ma classe que gerencia esse controle de transacao, mais na minha opiniao, e nao sou um expert no assunto, vc deveria usar um framework de injecao de dependencia, tipo um spring…, mais e minha opiniao…
Muito obrigado worldsoft e mausexdd.
Alguém teria um exemplo da utilização de Spring nesse caso?
Vou procurar algumas coisas, e posto o que achar.
Grato
eu vi spring bem por cima , oque vi na injecao de dep lá , é que não era necessario ficar instanciando objetos , voce só passa o BackBean no xml , ele faz isto para voce , agora sobre persistencia não sei dizer, de uma olhada no Framework VRaptor parece que ele integra hibernate com Spring , ctz tem métodos e maneiras bem eficazes de realizar esses metodos com este framework