2011-09-08 19 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:

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

このmethosが呼び出された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」というタグを付けると、値が変更されたことがわかりました私はフォームからパラメータを失う。

誰か手掛かりがありますか?

私は多くの場所でエンティティマネージャをフラッシュし、トランザクションタイプを変更しようとしましたが、値のみが伝播=「none」に

答えて

0

ビット、それほど簡単ではない対とのリンクでクリックで変更

あなたのコードが正しく理解されている場合は、ストアドプロシージャの呼び出しによって管理オブジェクトが変更されています。これにより、永続コンテキストが更新されないようにします。フラッシュは効果を持ちません(このオブジェクトに関して)。

これらのオブジェクトを明示的にリフレッシュすると、問題が解決するはずです(em.refresh())