Bom, queria tirar uma duvida.
Estou utilizando Spring 2.5(Transaction, Annotation, Security) + Hibernate o problema que estou tendo é quando eu vou salvar uma entity e o salvar é lançada alguma Exception, neste método que salva, e é feita um RollBack automatico pelo spring @Transaction até ai tudo bem, porem está entity recebe um Id mesmo após o RollBack, a meu ver o Hibernate consome a sequence definida porem quando é feito o Rollback este ID continua no meu objeto porem não existe este id no banco, neste caso eu preciso limpar os id das entitys que tiveram rollback, como eu tenho uma tela que salva muitos objetos ao mesmo tempo, o codigo pra limpar estes ids tá ficando grande e acho que o spring ou hibernate deferia fazer este trabalho.
Alguem já passou por este problema ou tem alguma informação se tem como configurar isso para o Spring ou Hibernate limpar os ids quando for feito rollback ou eu tenho que fazer manualmente mesmo ??
Vou dar um exemplo:
@Service
@Component
@WebScope(WebApplicationContext.SCOPE_SESSION)
public class ContratoMB{
@Autoriwed
private Contrato contrato;
@Autoriwed
private ProcessoJuridico processoJuridico;
@Autoriwed
private ProcessoJuridicoLogic processoJuridicoLogic;
@Autoriwed
private ContratoLogic contratoLogic;
//gets and sets
public void salvarContratoEProcesso(){
try{
processoJuridicoLogic.save(contrato, processoJuridico, contratoLogic);
}catch(LogicException e){
//o contrato está com id, porem no banco foi feito o RollBack
}
}
@Service
@Transactional
public class ProcessoJuridicoLogic{
@Transactional(propagation=Propagation.REQUERES_NEW, readOnly=false, rollbackFor={LogicException.class, ValidationException.class}
public void save(Contrato c, ProcessoJuridico pj, ContratoLogic contratoLogic) throws LogicException,ValidationException{
try{
contratoLogic.save(c);
throw new ValidationException("Erro teste rollback");//Lançando erro para verificar rollback.
processoJuridicoDAO.save(pj);
}catch(DaoException daoE){
throw new LogicException(daoE);
}
}
}
@Transactional
public class ContratoLogic{
@Transactional(propagation=Propagation.REQUERED, readOnly=false, rollbackFor={LogicException.class, ValidationException.class}
public void save(Contrato c) throws LogicException,ValidationException{
try{
contratoDAO.save(c);
}catch(DaoException daoE){
throw new LogicException(daoE);
}
}
}