Duvida Com Id AutoIncrement

Bom estou criando uma aplicação, e gostaria de saber se por exemplo nakele @GeneratedValue do hibernate, tem alguma opção q faça o hibernate indicar qdo deve ser criado um novo ID.
Por que crio a coluna id autoincrement no mysql, td bem mas no caso de salvar alguma coisa c acontecer uma exception ele ja tinha reservado akele ID, ai ja era… qdo for salvar de novo akele ID nem aparece mais…

Tipo eu to com Id 2 no banco, ai fui salvar um Usuario e deu exception qdo eu arrumei e fui d novo ele ja vai pro ID 4…

e eu keria saber algum modo de controlar isso pra n ficar perdendo ID smp…

Mto Obrigado quem puder me ajudar…

Não sei se existe alguma forma de impedir, mas essa é uma situação freqüente?
Se for, talvez o caso não seja de liberar novamente os id´s mas sim verificar a sua estrutura.
E caso não seja, não vejo problema em perder um ou outro índice pelo caminho.

[]´s

Daniel

Então Yorgan, seguinte pq com qualquer exception q da ele perde esse id. entao eu axei q sei la c o hibernate conseguisse gerenciar isso tipo… o proprio hibernate gerasse esse id…

Mas se vc diz q eh normal, eu tb axo normal porem c desse pra resolver isso seria mais interessante neh :D…

Eu até tirei, o autoincrement do banco pq eu pensei q o hibernate faria isso…

Será q n tem jeito???

Mesmo usar o “autoincrement” do próprio banco (isso é uma opção do Hibernate) também pode ocasionar IDs pulados. Se você der um shutdown em diversos bancos, então, a situação é pior ainda, porque alguns pulam várias centenas de IDs nessa história.

Se é um requisito de negócio que os IDs nunca sejam pulados (isso talvez seja uma ideia ruim, a menos que eles correspondam, por exemplo, a formulários impressos) então você precisa usar um outro gerador.

uma curiosidade… talvez esteja ai o seu problema

você esta usando commit automatico?

não esta dando rollback na transaction quando da algum problema?

Bom acho q estou…

no meu GenericDAO ta assim…

public void salvar(T entidade) throws NonUniqueObjectException{
		try{
			doBeginTransaction();
			getCurrentSession().save(entidade);
			doCommit();
		}
		
		catch (NonUniqueObjectException e) {
			doRollback();
			throw e;
		}
		catch (Exception e) {
			doRollback();
			e.printStackTrace();
		}
	}

E na Classe que está o doRollback();

public static void doRollback() throws HibernateException {   
        Transaction tx = threadTransaction.get();   
  
        try {   
            if(tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){   
                tx.rollback();   
                threadTransaction.set(null);  
                log.info("Rollback Efetuado");
            }   
        } catch (Exception e) {   
            throw new HibernateException(e);   
        }   
    }  

Por favor ve se ta meio certo pelo menos kkkk…
Talvez esteja errado…