1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Impedir incremento de sequence

Boa tarde.

Eu tenho uma classe com seu ID com a anotação abaixo:

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "produto_cod")
    private Long cod;

Na minha tabela, eu acrescentei um campo que não pode ter dado duplicado.

Até ai tudo bem. O problema é que se eu adiciono algum dado duplicado, meu método não adiciona os dados (correto), porém a sequence é incrementada. Ai vou adicionar um dado sem duplicidade, os dados são salvos, porém o id perde a sequencia.

Exemplo:

SITUAÇÃO 1:

Sequencia 1,2,3 ... no 4 eu adiciono dado duplicado - NÃO ADICIONA - CORRETO

SITUAÇÃO 2:

Sequencia 1,2,3 ... era para ser 4, mas após adicionar o ID é 5.... ficando 1,2,3,5

Queria saber como arrumar isso, se é possivel.

Att

  • Cara, a sequence é um recurso exatamente para evitar duplicidades. Quando você chama sua Sequence o banco de dados a executa como uma função dando um lock na base e pegando o último id válido e incrementando mais um, para evitar que os sequenciais se repitam. Logo, ao chamar seu insert essa função é chamada independente de dar certo ou não. Coloque-se no lugar do banco de dados e pense que multithreads agora vão acessar seu banco de dados no mesmo instante. O que você prefere, perder 1 registro de sequencial ou ter que lidar com o rollback de valores para cada situação?

    adriano_si   28 de abr de 2015
  • @adriano_si concordo. Vou pensar noutra solução então. Obrigado.

    exercitobr   28 de abr de 2015
  • Imagina 5 threads cada uma tentando fazer o insert na base e chamando a sequence. Vamos ser mais pessimistas e jogar 200 threads de Sistema fazendo isso. Acredite, os SGBD já pensaram nessa hipótese e chegaram a conclusão que não vale a pena. Se você está usando uma sequence é porque quer um ID único, não importando se eles estão na ordem ou não.

    adriano_si   28 de abr de 2015
  • curiosidade: Pra que vc precisa do id em "sequencia" nos seus registros?

    Thomas Teixeira   28 de abr de 2015
  • @adriano_si , estou usando o id para gerar uma numeração de orçamento.

    exercitobr   28 de abr de 2015
Mostrar todos os 8 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate jpa vraptor java ou faça a sua própria pergunta.