Rollback en Spring con Hibernate

Buen dia comunidad,

Estoy teniendo problemas al querer hacer rollback en un ws echo en java con spring framework y utilzando hibernate como orm, el ws realiza dos acciones en la BD, primero guarda la cabecera en una tabla y regresa el id que genero, posteriormente usa ese id para insertar en detalles los demas datos como son varios ese metodo de guardar lo tengo dentro de un for, pero los tengo en metodos separados en el business, en el controller es donde los mando a llamar, todos los metodos los tengo marcados con la anotacion @Transactional, pero cuando truena antes al momento de guardar el detalle, no me esta deshaciendo el dato de la cabecera, es decir, el primer save realizado.

Me podrian ayudar de favor, cualquier pista seria de gran ayuda, gracias..

Comparto el codigo:

//Metodo en el controller
        @Transactional
        public ResponseEntity<Void> setChequeraDistribuidor(ChequeraVO vo,HttpServletRequest request){
                Claims claims = (Claims)request.getAttribute(ClaimsEnum.CLAIMS_ID);
                String noEmpleado = claims.getSubject();
                vo.setUsuario(noEmpleado);
                int folioInicial = vo.getFolioInicial();
                int folioFinal = vo.getFolioFinal();
                FoliosId ids=null;
                FoliosDTO folio=null;
                CatestatusFolioDTO estatus=null;
               
                if(!this.sportCheckBO.validaRequeridosChequera(vo))
                        return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
       
                if(this.sportCheckBO.validaFoliosValor(new BigDecimal (vo.getFolioInicial()),new BigDecimal(vo.getFolioFinal())))
                        return new ResponseEntity<Void>(HttpStatus.CONFLICT);
               
                if(this.sportCheckBO.validaFoliosAsignar(BigDecimal.valueOf(vo.getFolioInicial()), BigDecimal.valueOf(vo.getFolioFinal())))
                        return new ResponseEntity<Void>(HttpStatus.FAILED_DEPENDENCY);
               
                vo = SportCheckAssembler.asignacionChequera(vo);
               
                Integer idChequera = this.sportCheckBO.setChequeraDistribuidor(vo);
                Integer idEst = 0;
                for (int i = folioInicial; i <= folioFinal; i++) {
                        ids = new FoliosId();
                       
                        ids.setIdChequera(idChequera);
                        ids.setFolio(i);
                        folio = new FoliosDTO();
                       
                        estatus = new CatestatusFolioDTO();
                                               
                        estatus.setIdEstatus(idEst.byteValue());
                       
                        folio.setId(ids);
                        folio.setCatestatusFolio(estatus);
                        this.sportCheckBO.saveFolios(folio);
                }
               
                return new ResponseEntity<Void>(HttpStatus.OK);
        }

//Metodos en el business
       //Metodo que guarda en cabecera
        @Transactional
        public Integer setChequeraDistribuidor(ChequeraVO vo){         
               
                ChequerasDTO dto = SportCheckAssembler.getChequeraAsignar(vo);
                dto = this.chequeraSportDAO.save(dto);
                log.debug(dto.getIdChequera());
                return dto.getIdChequera();
               
        }
       
       //Metodo que guarda los detalles
        @Transactional
        public void saveFolios(FoliosDTO folio){
                this.foliosDAO.save(folio);
        }

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Nopalin

No son transaccionales

Para que un método sea transaccional no basta con solo anotarlo con @Transactional, en tu contexto de spring tienes que definir un transaction strategy, el cual se hace definiendo un bean que implemente la interface PlatformTransactionManager. Cuando spring encuentra la definición de esta interface entre los beans que va a instanciar entonces ya sabe que strategia aplicar para la transaccionalidad, y ahora si a todos los métodos que encuentre anotados con @Transactional se la aplica. Yo por ejemplo utilizo el siguiente codigo para definir el bean:

@Bean public PlatformTransactionManager txManager() {
    org.springframework.jdbc.datasource.DataSourceTransactionManager man = new org.springframework.jdbc.datasource.DataSourceTransactionManager();
    man.setDataSource(dataSource());
    return man;
}

Como vez, también se le indica el bean datasource que estas usando para las conexiones a la base de datos.

Saludos