Método do DAO não fecho a sessão
28/01/2019
0
Fala ai pessoal, blz?
Então, no meu Projeto de TCC, estou com um problema. Eu em cada método do DAO não fecho a sessão, um exemplo:
Quando eu fui deletar algum objeto e esse objeto no mapeamento tinha algum OneToMany, ele reclama de duas sessões abertas e dava Transaction not sucessfuly started. Ai eu fiz um método para excluir por SQL Query
E está excluindo! Porém, hoje fui dar um update no projeto, pois Gerador vai ter uma List de EstoqueGerador... EstoqueGerador possui como atributos: idEstoqueGerador, Estoque e Gerador. A Classe Estoque possui: idEstoque, Material e quantidadeMaterial.
Ai eu consegui fazer tudo corretamente na Main (sem ser na view) e instanciei tudo... e foi para o banco sem nenhum error, porém na view, dava error de return null, pois como tem várias associações e essas associações não foram inicializadas, porém qd inicializei, deu StackOverFlow... Ai eu criei o seguinte:
Esses atributos e o método estão no ControladorLogado, que gerencia o login (sem o filtro ainda)
Porém quando usa o alterar do DAO, ele dá o mesmo error, não deixando dar update por causa de 2 sessões abertas, e dessa vez não da pra usar o NativeSQL, por causa que é INSERT...
Eu pensei em fazer um método que retornasse o ID da chave primária para fazer INSERT manualmente... Mas está difícil, sabe de algum jeito de acabar com esse problema de 2 sessões? Já tentei s.close() e abrir uma nova Sessão no mesmo método, etc.
Essa dúvida foi gerada a partir de um comentário na aula [url:descricao=Calendar + Impressão da data com Ajax–JSF 2.0 com Primefaces - Curso JSF com Primefaces - Parte 4]https://www.devmedia.com.br/calendar-impressao-da-data-com-ajax-jsf-2-0-com-primefaces-curso-jsf-com-primefaces-parte-4/24145[/url]
Então, no meu Projeto de TCC, estou com um problema. Eu em cada método do DAO não fecho a sessão, um exemplo:
public void alterar() { try { s.getTransaction().begin(); s.update(getObjetoModelo()); } catch (HibernateException ex) { String mensagem = UtilError.getMensagemErro(ex); System.err.println("Erro ao incluir alterar: " + mensagem); s.getTransaction().rollback(); } finally { s.getTransaction().commit(); s.flush(); } }
Quando eu fui deletar algum objeto e esse objeto no mapeamento tinha algum OneToMany, ele reclama de duas sessões abertas e dava Transaction not sucessfuly started. Ai eu fiz um método para excluir por SQL Query
public void excluirGeradorPorSQL(long id){ try{ s.getTransaction().begin(); int a = s.createSQLQuery("DELETE FROM Estoque WHERE gerador_idPessoaJuridica = " + id).executeUpdate(); int b = s.createSQLQuery("DELETE FROM Gerador WHERE idPessoaJuridica = " + id).executeUpdate(); }catch(HibernateException ex){ String mensagem = UtilError.getMensagemErro(ex); System.err.println("Erro ao excluir Gerador --> " + mensagem); s.getTransaction().rollback(); } s.getTransaction().commit(); s.flush(); }
E está excluindo! Porém, hoje fui dar um update no projeto, pois Gerador vai ter uma List de EstoqueGerador... EstoqueGerador possui como atributos: idEstoqueGerador, Estoque e Gerador. A Classe Estoque possui: idEstoque, Material e quantidadeMaterial.
Ai eu consegui fazer tudo corretamente na Main (sem ser na view) e instanciei tudo... e foi para o banco sem nenhum error, porém na view, dava error de return null, pois como tem várias associações e essas associações não foram inicializadas, porém qd inicializei, deu StackOverFlow... Ai eu criei o seguinte:
//Atributos para criar um Novo EstoqueGerador private Material matEscolhido = new Material(); private Estoque estoque = new Estoque(); private EstoqueGerador estoqueGer = new EstoqueGerador(); private double quantidadeMat = 0.0; public void adicionarNaLista(){ estoque.setMaterial(matEscolhido); estoque.setQuantidadeMaterial(quantidadeMat); estoque.setEstoqueGerador(estoqueGer); estoqueGer.setEstoque(estoque); estoqueGer.setGerador(geradorLogado); geradorLogado.adicionarEstoqueGerador(estoqueGer); DAO<Gerador> acesso = new DAO(geradorLogado); acesso.alterar(); }
Esses atributos e o método estão no ControladorLogado, que gerencia o login (sem o filtro ainda)
Porém quando usa o alterar do DAO, ele dá o mesmo error, não deixando dar update por causa de 2 sessões abertas, e dessa vez não da pra usar o NativeSQL, por causa que é INSERT...
Eu pensei em fazer um método que retornasse o ID da chave primária para fazer INSERT manualmente... Mas está difícil, sabe de algum jeito de acabar com esse problema de 2 sessões? Já tentei s.close() e abrir uma nova Sessão no mesmo método, etc.
Essa dúvida foi gerada a partir de um comentário na aula [url:descricao=Calendar + Impressão da data com Ajax–JSF 2.0 com Primefaces - Curso JSF com Primefaces - Parte 4]https://www.devmedia.com.br/calendar-impressao-da-data-com-ajax-jsf-2-0-com-primefaces-curso-jsf-com-primefaces-parte-4/24145[/url]
Rafael
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)