Eu estou implementado um Listener com o ServletContextListener para não precisar criar o EntityManagerFactory toda hora no meu DAO.
Na verdade eu quero retirar esse construtor da minha classe DAO genérica e passo-lo para o meu Listener, mas estou aprendendo a usar o Listener agora não sei exatemente como eu vou fazer isso, será que alguém poderia me dar uma ajuda?
A minha classe Listener que já está mapeada no meu arquivo web.xml
publicclassServletListenerimplementsjavax.servlet.ServletContextListener{publicvoidcontextInitialized(ServletContextEventarg0){System.out.println("Servlet Context is initialized....");}publicvoidcontextDestroyed(ServletContextEventarg0){System.out.println("Servlet Context is destroyed....");}}
A melhor abordagem para isso é colocar a EntityManagerFactory como singleton em uma classe a parte e reutilizado em outros lugares....
Pelo amor de Deus não crie a fabrica dentro dos DAOs....totalmente impraticavel....
Segue um modelo simples....
publicclassJPAUtil{privatestaticEntityManagerFactoryFABRICA;publicsynchronizedstaticvoidcarregarFabricaJPA(){if(FABRICA==null){try{FABRICA=Persistence.createEntityManagerFactory("sistema");System.out.println("Fabrica JPA criada com sucesso.");}catch(Exceptione){e.printStackTrace();thrownewIllegalStateException("Erro na criação da fabrica JPA - "+e.getMessage());}}}publicsynchronizedstaticvoiddestruirFabricaJPA(){if(FABRICA!=null){try{FABRICA.close();System.out.println("Fabrica JPA destruÃda com sucesso.");}catch(Exceptione){System.out.println("Erro na destruição da fabrica JPA - "+e.getMessage());e.printStackTrace();}}}publicstaticEntityManagergetSession(){if(FABRICA!=null){try{returnFABRICA.createEntityManager();}catch(Exceptione){System.out.println("Erro na criação da sessão JPA - "+e.getMessage());}}thrownewIllegalStateException("Fabrica JPA não foi carregada");}}@WebListenerpublicclassListenerContextoimplementsServletContextListener{@OverridepublicvoidcontextInitialized(ServletContextEventarg0){JPAUtil.carregarFabricaJPA();}@OverridepublicvoidcontextDestroyed(ServletContextEventarg0){JPAUtil.destruirFabricaJPA();}}
pelo que eu vi da classe ta tudo certo, o que ta acontecendo que FABRICA ta chegando null no getSession, entao vc vai ter q dar um debuggada ai no seu codigo para ver o que está acontecendo.
t+
ricardocomp
Só por curiosidade FernandoFranzini
Para implementar o padrão de projeto Singleton até onde eu sei eu tenho q ter o contrutor privado ñ?
[]'s.
FernandoFranzini
Tenho muitos projetos funcionando com isso…
Veja q no listene é imprimido stack quando não carrega a fabrica…post ai o erro!
FernandoFranzini
ricardocomp:
Só por curiosidade FernandoFranzini
Para implementar o padrão de projeto Singleton até onde eu sei eu tenho q ter o contrutor privado ñ?
[]'s.
Não necessariamente…veja nesse caso não temos construtor pq a instancia é criada no método carregarFabricaJPA().
Poderíamos dizer que seria um cenário variação de singleton.
ricardocomp
Eu ñ preciso fazer algo como context.setAttribute(), para poder recuperar no meu DAO?
O problema é q eu ñ estou conseguindo recuperar a sessão com o
EntityManagersession=JPAUtil.getSession();
[]'s.
FernandoFranzini
Para criar a sessão seu persistence.xml tem q estar ok!!!
Posta as exceptions ai…senão não tem com adivinhar…