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:
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

Rafael

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar