2017-07-12 1 views
1

J'ai un CrudRepository et une méthode pour supprimer les données:Scheduler, CrudRepository et TransactionRequiredException

public interface SampleRepository extends PagingAndSortingRepository<Sample, String> { 

    @Modifying 
    @Transactional 
    @Query("delete from Sample where creationTimestamp <= ?1") 
    public void deleteOutdatedData(Instant expirationTimestamp); 
} 

Il fonctionne si j'utilise un contrôleur de repos:

@RequestMapping(value = "/delele", method = RequestMethod.DELETE) 
public void deleteOldData(@RequestParam(value = "date") String date) { 
     sampleRepository.deleteOutdatedData(Instant.parse(date)); 
} 

Je voudrais mettre en œuvre un planificateur pour supprimer les données obsolètes. Par exemple:

@Scheduled(fixedDelayString = "${clean-processing-delay}") 
public void cleanOutdatedData() { 
    Instant instant = Instant.now().minusMillis(expirationInterval); 
    sampleRepository.deleteOutdatedData(instant); 
} 

Le planificateur fonctionne au bon moment, mais j'Intercepter une exception:

exception imbriquée est org.springframework.dao.InvalidDataAccessApiUsageException: exécution une mise à jour/supprimer requête ; exception imbriquée est javax.persistence.TransactionRequiredException: L'exécution d'une mise à jour /supprimer requête

Où suis-je trompé?

+0

Avez-vous lu [ce] (https://github.com/spring-projects/spring-boot/issues/3576# émissionecomment-295983737)? – Cepr0

+0

Merci, je vais essayer. – Alexander

Répondre

0

Vous devez Capturez vos méthode dans une transaction, comme ceci:

@Scheduled(fixedDelayString = "${clean-processing-delay}") 
    @Transactional 
    public void cleanOutdatedData() { 
    Instant instant = Instant.now().minusMillis(expirationInterval); 
    sampleRepository.deleteOutdatedData(instant); 
    } 
+0

Merci, mais cela n'a pas fonctionné aussi ((( – Alexander