2011-09-08 102 views
0

我有一个程序,改变了一个对象的值,并且在我调用过程之后,我做了一次搜索以找到已更改的对象,但它仍然具有相同的值,而不是该值已更改在数据库中。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:这methos被称为

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”,但我可以看到值已更改我从表单中失去了参数。

有人有线索吗?

我试图刷新实体管理器在很多地方并更改交易类型,但值只能与传播=“无”

回答

0

有点不那么易于链接与点击的变化阅读非葡萄牙语(?) - 扬声器;-)

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

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