2017-10-11 2 views
-1

je une entité liée à mon système de fichiers comme ceci:Supprimer un fichier sur JPA orphelin supprimer

@Entity 
public class MyDocument { 
    @Id 
    private Long documentId; 
    private String fileName; 
    private String filePath; 
    //Then a lot of other fields, getters and setters 
} 

Si je supprime un document de ma base de données (avec orpheline supprimer par exemple), je veux supprimer le fichier correspondant dans une méthode Async.

Une suggestion? Existe-t-il un moyen d'intercepter l'action de suppression JPA?

Répondre

1

Vous devez rechercher le cycle de vie des événements pour les entités, en particulier preRemove.

Avec la configuration d'annotation est aussi facile que de faire

@PreRemove 
public void deleteFile(){ 
    //your async logic 
} 

Edit: vous pouvez aussi créer un service séparé comme ça:

@Service 
public class FilerService { 
    @PostRemove 
    @Async 
    void deleteFile(MyDocument document) { 
     Files.deleteIfExists(Paths.get(document.getFilePath())); 
    } 
} 

Et lier avec @EntityListeners

@Entity 
@EntityListeners(FilerService.class) 
public class MyDocument { 
    @Id 
    private Long documentId; 
    private String fileName; 
    private String filePath; 
    //Then a lot of other fields, getters and setters 
} 
+0

Merci ! C'est ce que je cherchais. J'ai ajouté cet intercepteur dans un autre service: http://www.objectdb.com/java/jpa/persistence/event#Listeners_and_External_Callback_Methods_ –