2011-10-04 3 views
1

Un cas simple. Un utilisateur a beaucoup de photos. Lorsqu'un utilisateur est supprimé, toutes ses photos doivent également être supprimées (règle des cascades).Accrocher des actions personnalisées lors de la suppression en cascade

Je veux cependant être en mesure d'exécuter du code personnalisé juste avant que chaque photo est supprimée.

Malheureusement, lors de la suppression des utilisateurs, tout ce que je fais est d'appeler userDAO.deleteUser (userID), donc aucune action spécifique est prise sur les photos (ils sont supprimés par Hibernate lui-même)

Aussi, je ne suis pas vraiment Voulez-vous que l'userDAO sache qu'un utilisateur a des photos, ce code personnalisé doit donc être inséré ailleurs.

Je voudrais qu'il soit aussi simple que de donner un cours de rappel quand j'annote mes entité OnDelete, mais je ne l'ai pas vu une telle spécification dans les Hibernate docs

+0

Utilisez-vous du printemps? –

+0

@ danny.lesnik oui. J'ai oublié de le mentionner – user802232

Répondre

-1

alors je pense que vous devez appliquer SPring AOP sur la fonction qui supprime l'utilisateur.

par exemple:

public void deleteUser(User user){ 
Session session = sessionFactory.getcurrentSection(); 
//delete the object 

} 

Ce que vous devez faire est d'appliquer @Around conseils

@Pointcut("execution(* com.vanilla.dao.*.*(..))") 
    public void deleteUserMethods() { } 

    @Around("deleteUserMethods()") 
    public Object profile(ProceedingJoinPoint pjp) throws Throwable { 
      Object output = pjp.proceed(); 
      ///perform any operations on an pjp and its parameters. 
      return output; 
    } 

Je vous recommande de voir cet exemple:

http://veerasundar.com/blog/2010/01/spring-aop-example-profiling-method-execution-time-tutorial/

et printemps la documentation sera aussi très utile ul:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-schema

+0

Ceci est bien sur conçu pour quelque chose qui est déjà supporté par JPA: les écouteurs de rappel de cycle de vie, dans ce cas @PreRemove: http://java.sun.com/javaee/5/docs/api/javax/persistence /PreRemove.html –

+0

Eh bien oui, et techniquement, votre réponse est meilleure pour une telle configuration, mais vous devriez utiliser JPA dans Hibernate, et non pas l'ancienne fabrique Hibernate Session/Session (elle est recommandée par Hibernate elle-même). Et tandis que les aspects ont leur utilité, ils sont plus difficiles à implémenter/déboguer et devraient être évités pour une tâche aussi simple qui a une solution plus propre et plus simple. –

+0

Non. C'est l'application SPring/Hibernate. SessionFactory est un bean et je reçois une session par sessionFactory.getCurrentSession(). Chaque transaction d'hibernation est configurée et gérée par Spring AOP. alors quoi de mieux à utiliser, @preRemove ou AOP? –

Questions connexes