Tenho o seguinte código:
public ResponsePost adicionarLista(List<PedidosMOD> pedidos,
String idEmpresa, String idVendedor) {
ItensPedidoDAO itensPedidoDAO = new ItensPedidoDAO(conexao);
ResponsePost responsePost = new ResponsePost();
try {
conexao.setAutoCommit(false);
for (PedidosMOD p : pedidos) {
ps = conexao
.prepareStatement("INSERT INTO pedidos(id_empresa, id, data, id_cliente, id_forma_pagamento, id_condicao_pagamento, id_tipo_pedido, nota, valor_pedido, qtd_itens, obs, id_vendedor) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
ps.setInt(1, Integer.parseInt(idEmpresa));
ps.setInt(2, p.getId());
ps.setDate(3, new Date(p.getData().getTime()));
ps.setInt(4, p.getCliente().getId());
ps.setInt(5, p.getFormaPagamento().getId());
ps.setInt(6, p.getCondicaoPagamento().getId());
ps.setInt(7, p.getTipoPedido().getId());
ps.setBoolean(8, p.isNota());
ps.setBigDecimal(9, p.getValorPedido());
ps.setInt(10, p.getQtdItens());
ps.setString(11, p.getObs());
ps.setInt(12, Integer.parseInt(idVendedor));
ps.execute();
itensPedidoDAO.adicionarLista(idEmpresa, idVendedor,
p.getItens());
}
conexao.commit();
conexao.setAutoCommit(true);
responsePost.setOk("Pedidos adicionados com sucesso");
} catch (SQLException erro) {
System.out.println(""+erro.getErrorCode());
// erro de id ja existente no banco - id duplicada
if (erro.getErrorCode() != 335544665 && erro.getErrorCode() != 1062) {
try {
conexao.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
responsePost.setErro("Erro ao adicionar pedidos: " + erro.getMessage());
erro.printStackTrace();
}
} finally {
dispose();
}
}
Meu código é o seguinte: ele recebe uma lista de Pedidos e insere no BD, caso aconteça algum erro ele dá um roolback em tudo. Mas se o erro que der for de id duplicada ela não dá o roolback, ele insere os outros pedidos e esse pedido que está com id duplicada simplesmente não é inserido.
Mas ai que está o problema, se tiver uma lista com 10 pedidos, e o 3º pedido for de id duplicada, vai cair no catch e os outros 7 pedidos não serão executados, pq vai cair fora do FOR…
Como posso resolver isso???