commit with the @Transactional annotation in Spring

Asked

Viewed 277 times

1

Good afternoon! I am new to Java and Spring and I am in need of help in the code below. I need every iteration of for to be performed the commit, but it is only being performed at the end of the transaction, I came to create the persist method thinking that would open a new transaction and commit, but nothing. Could someone tell me how I should proceed? I thank you in advance.

@Override
@Transactional
public String enviarPedidos() {
    LOGGER.info("MassivoPedido :: enviarPedidos");

    final String[] listStatus = {Constante.UPLOAD_MASS_STATUS_AG_ENVIO, Constante.ENVIAR_MASS_PED_ERROR};
    final List<MassivoPedido> massivoPedidos = this.buscarPorStatus(listStatus);
    final List<MassivoPedidoParametro> massivoPedidoParametros = this.massivoPedidoParametroComponent.findAll();
    final Date agora = new Date();
    JSONObject retornoCriarPedidoJSONObject;
    for (MassivoPedido massivoPedido : massivoPedidos) {
        try {
            for(MassivoPedidoParametro massivoPedidoParametro : massivoPedidoParametros){
                try {
                    if (massivoPedidoParametro.getCnpjFornecedor().equalsIgnoreCase(massivoPedido.getCnpjFornecedor())) {
                        retornoCriarPedidoJSONObject = Util.buildJSONObject((this.fornecedorClient.criarPedido(massivoPedidoParametro, massivoPedido).toString().replace("Status","returnCode").replace("Message","returnMessage")));
                        LOGGER.info("MassivoPedido :: enviarPedidos - {}", retornoCriarPedidoJSONObject.toString());

                        if (retornoCriarPedidoJSONObject.getString("returnCode").equals("1") || retornoCriarPedidoJSONObject.getString("returnCode").equals("ERROR")) {
                            massivoPedido.setDatahoraReg(agora);
                            massivoPedido.setRetornoFornecedor(retornoCriarPedidoJSONObject.toString());

                            massivoPedido.setStatus(Constante.ENVIAR_MASS_PED_ERROR);

                            if (retornoCriarPedidoJSONObject.getString("returnMessage").equals("Duplicate PoNo")) {
                                massivoPedido.setStatus(Constante.ENVIAR_MASS_PED_SUCCESS);
                            }

                        } else {
                            massivoPedido.setStatus(Constante.ENVIAR_MASS_PED_SUCCESS);
                            massivoPedido.setDatahoraReg(agora);
                            massivoPedido.setRetornoFornecedor(retornoCriarPedidoJSONObject.toString());
                        }
                    }
                }
                catch (Exception e) {
                    massivoPedido.setStatus(Constante.ENVIAR_MASS_PED_ERROR);
                    massivoPedido.setDatahoraReg(agora);
                    massivoPedido.setRetornoFornecedor("Erro ao criar pedido " + massivoPedido.getIdPedido() + " no fornecedor " + massivoPedido.getCnpjFornecedor() + " " + e.toString());
                }

                this.persiste(massivoPedido);
            }
        } catch (Exception e) {
            LOGGER.error("Erro ao enviarPedidos - Massivo Pedido. Erro: {}", e.toString());
        }
    }
    return null;
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void persiste(MassivoPedido massivoPedido) {
    super.update(massivoPedido);
}
  • 1

    Wraps the code inside the for in a method the part with Propagation.REQUIRES_NEW. According to that answer should solve your problem. If it works out you let me know that I’ll do the same answer.

  • Try to create another class, and within it create the method with that transaction propagation you used in your method. This reply has a logic similar to what you need.

  • Hi @Ygorazevedo I tried this way and kept giving the commit only at the end of the first method transaction, but thanks for the help.

1 answer

-1

You can extract the behavior that is inside the for for a method and annotate this new method with @Transaction, so it will respect the transaction handled there first.

  • 1

    Danilo, it would be interesting for you to post a little code to illustrate what you mean.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.