Update/merge não funciona

8 respostas
ale0790

Galera, gostaria de saber o que pode estar aconteçendo, o que estou fazendo errado, do jeito que esta não da erro, mas tbem não atualiza os dados nobanco,se inicio a transacao no metodo, e do comiit altera os dados no banco, porem apareçe este erro
org.hibernate.TransactionException: Transaction not successfully started, na linha 21 do HibernateSessionFilter ( linha 11 aqui no post )

HibernateSessionFilter
public class HibernateSessionFilter implements Filter{

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HibernateUtil.openSession();
        try{
            HibernateUtil.currentSession().beginTransaction();
            chain.doFilter(request, response);
            HibernateUtil.currentSession().getTransaction().commit();
        } catch (Exception e){
            throw  new ServletException(e);
        } finally {
            HibernateUtil.closeCurrentSession();
        }
    }

    public void destroy() {
    }

}
Metodo Alterar no Bean
try {
             Session session = HibernateUtil.currentSession();
            Dao<Produto> pDao = new Dao<Produto>(session, Produto.class);
//            if (imagens.isEmpty() || imagens == null) {
//            } else {
////                Session s2 = HibernateUtil.currentSession();
////                 Dao<Img> iDao = new Dao<Img>(s2, Img.class);
//                for (int x = 0; x &lt; imagens.size(); x++) {
//                    imagens.get(x).setProduto(produto);
//                    if (Utilitarios.CriaImagem(imagens.get(x), caminhoImagensProdutos)) {
//                        System.out.println(&quot;Imagem &quot; + imagens.get(x).getNome() + &quot; criada com sucesso;&quot;);
//                        deletaImgTemporaria(imagens.get(x).getNome());
//                    }
//                }
//                for (int x = 0; x &lt; imagensDeletar.size(); x++) {
//                    deletaImgDefinitiva(imagensDeletar.get(x).getNome());
////                    Img mage = iDao.load(imagensDeletar.get(x).getIdimg());
//                    System.out.println(&quot;DELETO&quot;+imagensDeletar.get(x).getNome());
////                    iDao.delete(mage);
//                }
//                imagensDeletar = new ArrayList<Img>();
//            }
//            
            if(!jornal){
                produto.setJornal(null);
            }
            produto.setImgList(imagens);
            pDao.merge(produto);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, &quot;Produto alterado com sucesso!&quot;, &quot;Informação&quot;));
            limpaTelaCadastroNovoProduto();
            System.out.println(&quot;Alterou um produto.&quot;);
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, &quot;Não foi possivel alterar o produto selecionado, tente novamente!&quot;, &quot;Aviso&quot;));
            System.out.println(e);
        }
web.xml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;HibernateSessionFilter&lt;/filter-name&gt;
        &lt;filter-class&gt;modelo.dao.HibernateSessionFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;HibernateSessionFilter&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;LoginFilter&lt;/filter-name&gt;
        &lt;filter-class&gt;classes.LoginFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;LoginFilter&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;session-config&gt;
        &lt;session-timeout&gt;
            30
        &lt;/session-timeout&gt;
    &lt;/session-config&gt;
    &lt;welcome-file-list&gt;
        &lt;welcome-file&gt;faces/index.xhtml&lt;/welcome-file&gt;
    &lt;/welcome-file-list&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;PrimeFaces FileUpload Filter&lt;/filter-name&gt;
        &lt;filter-class&gt;
org.primefaces.webapp.filter.FileUploadFilter
        &lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;PrimeFaces FileUpload Filter&lt;/filter-name&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;/filter-mapping&gt;
&lt;/web-app&gt;

Alguem pode me ajudar?
Agradeço desde ja

8 Respostas

M

Fala Ale,

É impressão minha ou você você está utilizando uma nova session e não a criada no Filter. Talvez possa ser isso. Você cria uma session no Filter, mas utiliza outra no método.

Só uma pergunta: qual é a linha 21 do HibernateSessionFilter? :slight_smile:

Fica com Deus

ale0790

Eita… HAWuehawu na verdade alterei pra openSession pra teste mas é HibernateUtil.currentSession(); vo altera o post…

a linha 21 é a linha 11 aqui do post:

HibernateUtil.currentSession().getTransaction().commit();

Valeu por enquanto :wink:

M

:smiley:

A única coisa que consegui enxergar até agora é que antes do commit, alguma coisa impede o update(meio óbvio minha dedução :lol: ). Tenta não fazer nada após o merge(inclusive dentro do DAO). Coloca uns prints no Filter pra ver se a session ainda está ativa antes e depois do doFilter e vê o que acontece. Se há uma session ativa, você fizer o merge e dar o commit na mesma session não tem por que não dar certo.

M

Faz o teste de colocar também o show_sql como true e ver se a query do update é “printada”.

ale0790

Coloquei um System.out.print no filtro após o commit e olha o que acontece, parece q executou 4x o.O, não deu erro, mas tbem não alterou.
[img]https://lh6.googleusercontent.com/-0c6QxqaohAY/Tor9ej1BwxI/AAAAAAAAALk/9edI0hgj6P4/Image.jpg[/img]

Então, tenho um outro update em outro bean, e esse funciona normal

CategoriaBean
public void alterarCategoriaDefinitivamente() {
        status = true;
        try {
            Session session = HibernateUtil.currentSession();
            Dao&lt;Categoria&gt; dao = new Dao&lt;Categoria&gt;(session, Categoria.class);
            dao.merge(categoria);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Categoria alterada com sucesso!", "Aviso"));
           
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Não foi possivel alterar a categoria selecionada, tente novamente!", "Aviso"));
            System.out.println(e);
        }
    }

coloquei o show sql
e olha o que apareçe o.O

[img]https://lh6.googleusercontent.com/-7_Ww783CE5M/Tor_xkr1PhI/AAAAAAAAALw/XVoh9daOuWA/s1024/Image.jpg[/img]

Não deveria ter um update ali no meio ?

Que diabos!

:S

Valeu pela atenção mesmo assim!

ale0790

up ^^

M

Ale, alguma novidade sobre este problema? Achou a solução?

Cara, se eu não estiver enganado, a query do update só vai aparece lá nos prints se for dado o commit.

Pra mim, o problema ainda é no gerenciamento de sessão. Você não está dando commit na mesma session que executa o merge.

ale0790

nada ainda, update nas categorias,pedidos funciona ^^, ja nas marcas/produto não :S

alguem ?

Criado 4 de outubro de 2011
Ultima resposta 14 de out. de 2011
Respostas 8
Participantes 2