2011-10-04 38 views
1

一个简单的情况。用户有很多照片。当用户被删除时,他/她的所有照片也应该被删除(级联规则)。删除级联时挂钩自定义操作

但是我希望能够在每张照片被删除之前执行一些自定义代码。

不幸的是,删除用户时,所有我做的是调用userDAO.deleteUser(用户ID),所以没有具体的操作是针对照片

而且(他们是由Hibernate本身删除),我真的不希望userDAO知道用户有照片,所以这个自定义代码应该插入其他地方。

我想它是作为给人一种OnDelete回调,当我annote我的实体类一样简单,但我还没有看到任何这样的规格在Hibernate文档

+0

您是否在使用Spring? –

+0

@ danny.lesnik是的。我忘了提及它 – user802232

回答

-1

那么我认为你需要在应用的Spring AOP删除用户的功能。

例如:

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

} 

你需要做的是应用@Around建议

@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; 
    } 

我建议你看看这个例子:

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

和Spring文档也将非常有帮助ul:

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

+0

这是为JPA已经支持的东西而设计的:生命周期回调监听器,在这种情况下@PreRemove:http://java.sun.com/javaee/5/docs/api/javax/persistence /PreRemove.html –

+0

好的,从技术上说,你的答案对于这样的设置更好,但是你应该在Hibernate中使用JPA,而不是在Hibernate Session/Session工厂中使用(它由Hibernate本身推荐)。虽然方面有用,但它们很难实现/调试,应该避免这样一个简单的任务,它有一个更清洁,更简单的解决方案。 –

+0

不,这是SPring/Hibernate应用程序。 SessionFactory是bean,我通过sessionFactory.getCurrentSession()获取会话。 Spring AOP配置和管理每个hibernate事务。所以最好使用@preRemove或AOP? –