Pessoal é o seguinte:
Estou usando o framework Mentawai 1.8 e Hibernate 3.2 + annotations;
Ai ocorre o seguinte eu tenho classes DAO que, ao serem instânciadas, usam o seguinte factory:
public class HibernateDAOFactory extends DAOFactory {
public HibernateDAOFactory() {}
public UsuarioDAO getUsuarioDAO() {
return (UsuarioDAO) instanciarDAO(HibUsuarioDAO.class);
}
private HibGenericDAO instanciarDAO(Class daoClass) {
try {
HibGenericDAO dao = (HibGenericDAO)daoClass.newInstance();
dao.setSession(getCurrentSession());
return dao;
} catch (Exception ex) {
throw new RuntimeException("Não foi possível instanciar o DAOFactory: " + daoClass, ex);
}
}
protected Session getCurrentSession() {
try{
return HibernateUtil.getSessionFactory().getCurrentSession();
}catch (HibernateException ex ){
return HibernateUtil.getSessionFactory().openSession();
}
}
}
Como foi possível perceber, a session é atribuida durante o instanciar da classe.
Primeira pergunta: Alguém tem alguma sugestão para melhorar este processo uma vez que eu não tenho como fechar a Session aberta?
Só que, como o Mentawai tem uma funcionalidade para gerenciamento de sessões hibernate, configurei, debuguei e percebi que este funcionando corretamente, gostaria de usar esta funcionalidade mas não vejo onde usar. E ainda por cima debuguei e precebi que sempre é gerada uma exceção quando utilizo getCurrentSession, o que ocasiona em uma nova abertura de Session.
nota: A instância de SessionFactory utilizada pelo framework é a mesma utilizada pela classe acima.
Segunda pergunta: O que fazer uma vez que a interface de um DAO não deve conhecer, por exemplo, um método setSession?
Só pra terminar, quando utilizo o TransactionFilter do mentawai, desta forma (Em ApplicationManager)
@Override
public void init(Context application) {
ioc("transaction", HibernateTransaction.class);
}
public void loadActions() {
// -------------IoC Global Filter-----------------
filter(new IoCFilter());
// -----------------------------------------------
// -------------Hibernate Filter------------------
addGlobalFilter(new HibernateFilter(HibernateUtil.getSessionFactory()));
// -----------------------------------------------
ActionConfig ac = null;
// --------------INICIAR ACTION-------------------
ac = new ActionConfig("/iniciar", Iniciar.class).addConsequence(
SUCCESS, new Forward(PREFIXO_VIEW + "/iniciar.jsp"))
.addConsequence(ERROR, new Forward(PAGINA_DE_ERRO_JSP));
addActionConfig(ac);
// -----------------------------------------------
// make this action atomic !!!!
// by default this filter will look for a transaction with the name
// "transaction" in the action input
// refer above that this is exactly like we defined our IoC component...
ac.addFilter(new TransactionFilter());
}
Tenho a seguinte pilha de erros:
exception
javax.servlet.ServletException: Exception while invoking action iniciar: null
org.mentawai.core.Controller.service(Controller.java:537)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NullPointerException
org.mentawai.transaction.HibernateTransaction.rollback(HibernateTransaction.java:91)
org.mentawai.filter.TransactionFilter.filter(TransactionFilter.java:136)
org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
org.mentawai.filter.HibernateFilter.filter(HibernateFilter.java:186)
org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
org.mentawai.filter.DIFilter.filter(DIFilter.java:171)
org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
org.mentawai.filter.IoCFilter.filter(IoCFilter.java:82)
org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
org.mentawai.core.Controller.invokeAction(Controller.java:635)
org.mentawai.core.Controller.service(Controller.java:496)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
Por favor HELP!!!