2
respostas

[Sugestão] Auto increment do ID

Apenas como sugestao, o id incrementa de 1 em 1 mesmo se os dados nao forem gravados no banco, por exemplo se eu repetir um email, ele da uma exception dizendo que esse email ja existe, logo ele nao grava mas add + 1 no ID....

2 respostas

Isso, estou com o mesmo problema do Alex. Mesmo dando erro 500, o autoincrement atua sobre o ID, quando na verdade deveria incrementar quando a validação estivesse dentro dos padrões estipulados.

Vou criar uma historia pra tentar explicar:

Era uma vez uma aplicação web que usava o Spring JPA para persistir dados em um banco de dados. Nessa aplicação, havia uma entidade chamada "Usuário" com um campo "e-mail" que deveria ser único. O banco de dados foi configurado para gerar IDs automaticamente (autoincremento) para cada novo usuário.

No início, dois usuários foram inseridos com sucesso no banco de dados. O primeiro usuário tinha o ID 1, e o segundo tinha o ID 2. Tudo estava indo bem até então.

Mais tarde, um terceiro usuário foi inserido. No entanto, ao tentar salvar esse usuário, ocorreu um erro, pois o email já existia no banco de dados. Isso levou a uma exceção de violação de chave única.

A razão por trás desse erro foi que o campo "email" estava configurado como único no banco de dados, o que significa que não poderia haver mais de um registro com o mesmo valor de email. Como o terceiro usuário estava tentando usar um e-mail que já existia, o banco de dados acionou uma exceção para evitar a violação da restrição de unicidade.

O problema era que o sistema não lidou com essa exceção, não revertendo a compra e não liberando o ID 3 para ser reutilizado. Em vez disso, o ID 3 ficou "bloqueado" devido a uma tentativa malsucedida de inserção.

Para resolver esse problema, a equipe de desenvolvimento tomou medidas para tratar o erro corretamente. Eles implementaram um tratamento de exceção que detectou a exceção de violação de chave única. Quando essa exceção ocorre, o sistema reverte automaticamente a transação, liberando o ID que estava bloqueado.

Assim, quando o usuário tentou inserir um novo usuário novamente, o sistema, após a correção, conseguiu reutilizar o ID 3, em vez de continuar a partir do último ID "disponível" (que era 4). Agora, o novo usuário recebeu o ID 3, e a aplicação funcionou sem problemas, garantindo que os IDs não fossem perdidos devido a erros de inserção.

Tratamento de Erro no Código Para tratar o erro de violação de chave única, é importante usar um bloco try-catchpara capturar a exceção e agir de acordo. Aqui está um exemplo de código que demonstra como fazer isso usando o Spring JPA:

@Service
public class UsuarioService {
    @Autowired
    private UsuarioRepository usuarioRepository;

    @Transactional
    public Usuario salvarUsuario(Usuario usuario) {
        try {
            return usuarioRepository.save(usuario);
        } catch (DataIntegrityViolationException e) {
            // Tratar a exceção de violação de chave única aqui
            // Reverter a transação, se necessário
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            // Realizar outras ações, como registrar o erro ou notificar o usuário
            throw new CustomDataIntegrityException("Já existe um usuário com o mesmo email.");
        }
    }
}

Neste exemplo, quando ocorre uma exceção DataIntegrityViolationException, o código reverte a transação usando TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()e lança uma exceção personalizada para notificar o usuário sobre o problema.

Esse tratamento adequado de erros garante que os IDs autoincrementáveis ​​não sejam desperdiçados devido a falhas de inserção.

Lembre-se de personalizar o tratamento de acordo com os requisitos e necessidades específicos do seu aplicativo.

Espero ter ajudado.