Dúvida Erro SQL

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???

Em vez de teres o for dentro do try, colocas o try dentro do for

Fiz assim:
Teria alguma outra forma melhor??

public ResponsePost adicionarLista(List<PedidosMOD> pedidos,
            String idEmpresa, String idVendedor) {
        ItensPedidoDAO itensPedidoDAO = new ItensPedidoDAO(conexao);
        ResponsePost responsePost = new ResponsePost();

        for (PedidosMOD p : pedidos) {
            try {
                conexao.setAutoCommit(false);
                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());

                responsePost.setOk("Pedidos adicionados com sucesso");
            } catch (SQLException erro) {
                // 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();
                    break;
                }
            }
        }

       if (!responsePost.isErro()) {
            try {
                conexao.commit();
                conexao.setAutoCommit(true);
            } catch (SQLException erro) {
                responsePost.setErro("Erro ao adicionar pedidos: "
                    + erro.getMessage());
            }
       }

    dispose();

        return responsePost;
    }

Uma dúvida, o commit deve ser acionado se todos os itens forem inseridos com sucesso?

Pergunto isso porque vi dois try/catchs e para essa situação faria dessa forma:

int itensInseridos = 0;
// for, instancias, etc...
try {
    ps.execute();
    itensInseridos++;
} catch (SQLException erro) {
    // ... erro...               
}
// fim do for...

if (itensInseridos == pedidos.size()) {
    conexao.commit();
} else {
    conexao.rollback();
}

LostSoldier, o commit deve ser executado se todos registros forem inseridos com sucesso, mas o erro de Id duplicada não quero contar como erro…

Então se der erro de id duplicada eu quero tratar como se não fosse erro e seguir a execução sem dar roolback, mas se caso o erro for algum outro eu paro a execução e dou roolback

Entendi, nesse caso o int itensInseridos pode ser descartado, agora com relação a performance, aconselho o try/catch envolta do método execute como mostrei acima, aliás, sugiro utilizar o executeUpdate ao invés de execute.

LostSoldier, neste seu exemplo no conexo.commit() vc nao usou try catch e o java obriga a usar…

Realmente, havia me esquecido desse detalhe, é interessante implementar.

Coloque o try-catch dentro do for, com os comandos que podem lançar a execução dentro do try. Dessa, se o programa lançar uma excessão, ele vai tratar a excessão no catch e continuar executando o for. Da forma que você fez, se ele lança uma excessão, essa excessão é capturada no catch que está fora do for, assim o programa trata a excessão e parte para o que tá depois dele. Se você quiser saber mais sobre tratamento de excessões, aconselho ler o capítulo 11 do livro Java Como Programar - Paul e Harvey Deitel, 8º edição.
Espero ter ajudado.