Oracle和Seam事务问题



我有一个过程,改变一个对象的值,在我调用过程后,我做一个搜索,找到改变的对象,但它仍然具有相同的值,而不是值已经在数据库中改变。

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

@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;
}   

但是值没有改变,如果我在调用搜索方法的按钮上放一个标签"propagation: none",我可以看到值改变了,但是我从表单中丢失了参数。

有人知道吗?

我试图在许多地方刷新实体管理器并更改事务类型,但值仅在链接中点击propagation="none"时更改

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

如果我对你的代码理解正确的话,你是通过调用存储过程来改变托管对象的。这可以防止持久化上下文被更新——刷新应该没有影响(对于这些对象)。

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

相关内容

  • 没有找到相关文章

最新更新