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);
}
Wraps the code inside the
for
in a method the part withPropagation.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.– Ygor Azevedo
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.
– StatelessDev
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.
– Rodrigo Lima