Оракул и проблема транзакции шва - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть процедура, которая изменяет значения из объекта, и после того, как я вызвал процедуру, я делаю поиск, чтобы найти измененный объект, но он все еще с тем же значением, вместо того, чтобы значение уже изменилось в базе данных.

Мой контроллер получает значения для изменения:

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

но значения не изменились, я мог видеть измененные значения, если бы я поместил тег «распространение: нет» на кнопку, которая вызывает метод поиска, но я потерял параметр из формы.

у кого-то естьПодсказка?

Я пытался очистить менеджер сущностей во многих местах и ​​изменить тип транзакции, но значения меняются только при щелчке по ссылке с распространением = "нет"

1 Ответ

0 голосов
/ 09 сентября 2011

Немного не так легко читается для не португальских (?) - говорящих; -)

Если я правильно понимаю ваш код, вы меняете управляемые объекты посредством вызова хранимой процедуры. Это удерживает контексты постоянства от обновления - сброс не должен иметь никакого эффекта (в отношении этих объектов).

Явное обновление этих объектов перед тем, как вы к ним прикоснетесь, должно решить вашу проблему ( em.refresh ()) .

...