Oracle和Seam事务问题

发布于 2024-12-03 15:59:31 字数 4851 浏览 2 评论 0原文

我有一个更改对象值的过程,在调用该过程后,我进行搜索以查找更改的对象,但它仍然具有相同的值,而不是数据库中的值已更改。

我的控制器接收要更改的值:

@Begin(join=true, flushMode=FlushModeType.COMMIT)
public String validarArquivo() throws Exception
{   
    if(arquivoImportacaoId != null)
    {
        importarArquivoTransacaoBusiness.validarArquivo(arquivoImportacaoId, seamSession.getIdUsuario());

        arquivoImportacaoId = null;
    }       

    //buscarArquivosImportacao();

    statusValidaArquivo = 1;

    return "sucesso";
}

DAO:

em.createNativeQuery("{call PRC_PROCESSAR_ARQUIVO (" + arquivoImportacaoId + ", " + UsuarioId + ") }").executeUpdate();    
em.flush();
em.joinTransaction();

在执行 dao 后调用此方法:

@In(create = true)
EntityManager em;

public List<ArquivoImportacao> buscarArquivoTransacao(ImportarArquivoTransacaoForm importarArquivoTransacaoForm) throws Exception{      

    em.flush();
    em.joinTransaction();

    List<ArquivoImportacao> lstArquivoImportacao = new ArrayList<ArquivoImportacao>();

    StringBuilder strQuery = new StringBuilder();       

    strQuery.append("select a from ArquivoImportacao a where 1=1 ");

    strQuery.append("and a.status <> 'CAN' ");

    if(importarArquivoTransacaoForm != null)
    {           

        if (importarArquivoTransacaoForm.getIdArquivo() != null )
            strQuery.append("and a.idImportacao = :idImportacao ");

        if (importarArquivoTransacaoForm.getLote() != null )
            strQuery.append("and a.numeroLote = :pNumeroLote ");

        if (importarArquivoTransacaoForm.getNomeArquivo() != null && !importarArquivoTransacaoForm.getNomeArquivo().trim().equals("") )
            strQuery.append("and lower(a.nomeArquivo) like lower( :pNomeArquivo ) ");

        if (importarArquivoTransacaoForm.getCnpj() != null && !Util.clearNumber(importarArquivoTransacaoForm.getCnpj()).equals(""))
            strQuery.append("and a.cliente.cnpj = :pCnpj ");

        if (importarArquivoTransacaoForm.getDataProcessamento() != null )
            strQuery.append("and a.dataProcessamento >= :pDataProcessamento ");

        if (importarArquivoTransacaoForm.getDataProcessamentoAte() != null )
            strQuery.append("and a.dataProcessamento < :pDataProcessamentoAte ");

        if (importarArquivoTransacaoForm.getStatus() != null && !importarArquivoTransacaoForm.getStatus().equals(""))
            strQuery.append("and a.status = :pStatus ");

        //ordenação da query
        strQuery.append("order by a.numeroLote");

        Query query = em.createQuery(strQuery.toString());  

        if (importarArquivoTransacaoForm.getIdArquivo() != null )
            query.setParameter("idImportacao", importarArquivoTransacaoForm.getIdArquivo() );

        if (importarArquivoTransacaoForm.getLote() != null )
            query.setParameter("pNumeroLote", importarArquivoTransacaoForm.getLote() );

        if (importarArquivoTransacaoForm.getNomeArquivo() != null && !importarArquivoTransacaoForm.getNomeArquivo().trim().equals("") )
            query.setParameter("pNomeArquivo", "%" + importarArquivoTransacaoForm.getNomeArquivo() + "%");

        if (importarArquivoTransacaoForm.getCnpj() != null && !Util.clearNumber(importarArquivoTransacaoForm.getCnpj()).equals(""))
            query.setParameter("pCnpj", Util.clearNumber(importarArquivoTransacaoForm.getCnpj()));

        if (importarArquivoTransacaoForm.getDataProcessamento() != null )
            query.setParameter("pDataProcessamento", importarArquivoTransacaoForm.getDataProcessamento());

        if (importarArquivoTransacaoForm.getDataProcessamentoAte() != null )
        {
            Calendar cal = Calendar.getInstance();

            cal.setTime(importarArquivoTransacaoForm.getDataProcessamentoAte());

            cal.add(Calendar.DAY_OF_MONTH, 1); //Adiciona Um dia        

            cal.set(Calendar.HOUR, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);

            query.setParameter("pDataProcessamentoAte", cal.getTime());
        }           

        if (importarArquivoTransacaoForm.getStatus() != null && !importarArquivoTransacaoForm.getStatus().equals(""))
            query.setParameter("pStatus", importarArquivoTransacaoForm.getStatus());

        lstArquivoImportacao =  query.getResultList();
    }
    else
    {
        strQuery.append("order by a.numeroLote");

        Query query = em.createQuery(strQuery.toString());  
        lstArquivoImportacao =  query.getResultList();          
    }

    return lstArquivoImportacao;
}   

但值未更改,如果我在调用搜索方法的按钮上放置标签“传播:无”,我可以看到值已更改,但我丢失了表单中的参数。

有人有线索吗?

我尝试在许多地方刷新实体管理器并更改事务类型,但这些值仅通过单击传播=“none”的链接来更改

I have a procedure that change the values from an object and after i have called the procedure i do a search to find the changed object but it still with the same value, instead of the value is already changed in database.

My controller receive the values to change:

@Begin(join=true, flushMode=FlushModeType.COMMIT)
public String validarArquivo() throws Exception
{   
    if(arquivoImportacaoId != null)
    {
        importarArquivoTransacaoBusiness.validarArquivo(arquivoImportacaoId, seamSession.getIdUsuario());

        arquivoImportacaoId = null;
    }       

    //buscarArquivosImportacao();

    statusValidaArquivo = 1;

    return "sucesso";
}

DAO:

em.createNativeQuery("{call PRC_PROCESSAR_ARQUIVO (" + arquivoImportacaoId + ", " + UsuarioId + ") }").executeUpdate();    
em.flush();
em.joinTransaction();

after the dao execution this methos is called:

@In(create = true)
EntityManager em;

public List<ArquivoImportacao> buscarArquivoTransacao(ImportarArquivoTransacaoForm importarArquivoTransacaoForm) throws Exception{      

    em.flush();
    em.joinTransaction();

    List<ArquivoImportacao> lstArquivoImportacao = new ArrayList<ArquivoImportacao>();

    StringBuilder strQuery = new StringBuilder();       

    strQuery.append("select a from ArquivoImportacao a where 1=1 ");

    strQuery.append("and a.status <> 'CAN' ");

    if(importarArquivoTransacaoForm != null)
    {           

        if (importarArquivoTransacaoForm.getIdArquivo() != null )
            strQuery.append("and a.idImportacao = :idImportacao ");

        if (importarArquivoTransacaoForm.getLote() != null )
            strQuery.append("and a.numeroLote = :pNumeroLote ");

        if (importarArquivoTransacaoForm.getNomeArquivo() != null && !importarArquivoTransacaoForm.getNomeArquivo().trim().equals("") )
            strQuery.append("and lower(a.nomeArquivo) like lower( :pNomeArquivo ) ");

        if (importarArquivoTransacaoForm.getCnpj() != null && !Util.clearNumber(importarArquivoTransacaoForm.getCnpj()).equals(""))
            strQuery.append("and a.cliente.cnpj = :pCnpj ");

        if (importarArquivoTransacaoForm.getDataProcessamento() != null )
            strQuery.append("and a.dataProcessamento >= :pDataProcessamento ");

        if (importarArquivoTransacaoForm.getDataProcessamentoAte() != null )
            strQuery.append("and a.dataProcessamento < :pDataProcessamentoAte ");

        if (importarArquivoTransacaoForm.getStatus() != null && !importarArquivoTransacaoForm.getStatus().equals(""))
            strQuery.append("and a.status = :pStatus ");

        //ordenação da query
        strQuery.append("order by a.numeroLote");

        Query query = em.createQuery(strQuery.toString());  

        if (importarArquivoTransacaoForm.getIdArquivo() != null )
            query.setParameter("idImportacao", importarArquivoTransacaoForm.getIdArquivo() );

        if (importarArquivoTransacaoForm.getLote() != null )
            query.setParameter("pNumeroLote", importarArquivoTransacaoForm.getLote() );

        if (importarArquivoTransacaoForm.getNomeArquivo() != null && !importarArquivoTransacaoForm.getNomeArquivo().trim().equals("") )
            query.setParameter("pNomeArquivo", "%" + importarArquivoTransacaoForm.getNomeArquivo() + "%");

        if (importarArquivoTransacaoForm.getCnpj() != null && !Util.clearNumber(importarArquivoTransacaoForm.getCnpj()).equals(""))
            query.setParameter("pCnpj", Util.clearNumber(importarArquivoTransacaoForm.getCnpj()));

        if (importarArquivoTransacaoForm.getDataProcessamento() != null )
            query.setParameter("pDataProcessamento", importarArquivoTransacaoForm.getDataProcessamento());

        if (importarArquivoTransacaoForm.getDataProcessamentoAte() != null )
        {
            Calendar cal = Calendar.getInstance();

            cal.setTime(importarArquivoTransacaoForm.getDataProcessamentoAte());

            cal.add(Calendar.DAY_OF_MONTH, 1); //Adiciona Um dia        

            cal.set(Calendar.HOUR, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);

            query.setParameter("pDataProcessamentoAte", cal.getTime());
        }           

        if (importarArquivoTransacaoForm.getStatus() != null && !importarArquivoTransacaoForm.getStatus().equals(""))
            query.setParameter("pStatus", importarArquivoTransacaoForm.getStatus());

        lstArquivoImportacao =  query.getResultList();
    }
    else
    {
        strQuery.append("order by a.numeroLote");

        Query query = em.createQuery(strQuery.toString());  
        lstArquivoImportacao =  query.getResultList();          
    }

    return lstArquivoImportacao;
}   

but the values are not changed, i could see the values changed if i put a tag "propagation: none" on the button that call the search method, but i lose the parameter from the form.

someone has a clue?

i tried to flush the entity manager in many places and change the transaction type but the values only changes with a click in a link with propagation="none"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寂寞陪衬 2024-12-10 15:59:31

对于非葡萄牙语(?)使用者来说有点不太容易阅读;-)

如果我正确理解您的代码,您将通过调用存储过程来更改托管对象。这可以防止持久性上下文被更新 - 刷新应该没有效果(关于此对象)。

在触摸这些对象之前显式刷新它们应该可以解决您的问题(em.refresh())

A bit not-so-easy-to-read for non Portuguese(?)-speakers ;-)

If I understand your code correctly you are changing managed objects through the call of a stored procedure. This keeps the persistence contexts from being updated - a flush should have no effect (regarding this objects).

Refreshing these objects explicitly before you touch them should solve your problem (em.refresh()).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文