2009-10-05 62 views
2

考虑与此类似关于跨领域关注的有趣的AOP问题?

public void addObject(Long sessionId, Long clientId, Dom obj){...} 

现在每个域POJO(Dom)方法一组波达都有sessionId属性和每个插入,更新或删除域对象一个sessionId必须setSessionId(Long sessionId)如此传递我们可以知道谁做了什么。但似乎这切入了所有数据访问的内容,我们和我认为AOP将成为将sessionId插入@Before(JoinPoint)@Around(ProceedingJoinPoint)建议的好工具。这实际上可行吗?这些DAO大部分都是基于Hibernate的一些Spring StoredProcedure

+0

我很困惑......如果sessionId是Dom对象的一部分,为什么它也是DAo方法中的参数? – skaffman 2009-10-05 21:42:20

+0

控制我的错误,但要澄清sessionId在代码中手动(以编程方式)设置,但上面的方法是一个建议的解决方案,其中AOP可以插入sessionId而无需开发人员处理它。方法签名是不正确的,因为某些东西需要传递给sessionId的方法。建议会从实用程序代码中检索sessionId并插入它。 – 2009-10-05 21:50:41

回答

1

您的sessionId参数似乎属于审计方面。在Hibernate中,这种审计方面通常在org.hibernate.Interceptor的实现中实现。

您可以为您的实体和查询实现许多与生命周期事件相对应的方法。在你的实现中,很容易获得你当前的sessionId(它可以使用ThreadLocal变量)。清理和干净,快速;-)

这可能比自己用AOP做起来更简单,尤其是当您从生命周期事件获得Hibernate的回调时。

1

围绕DAO层的拦截器会对传递持久性(即休眠操作(保存,删除...)级联到关联实体)造成困难。 Hibernate会话拦截器可以。

在任何情况下,如果你的拦截器可以以某种方式发现当前的会话ID,这是可能的。

1

我不明白为什么你不能这样做,我实际上在过去做过类似的事情(更复杂一些),帮助我不交叉重构每一个课程!

你有没有想过把 public void addObject(Long sessionId,long clientId,Dom obj){...} 在父级/上级类中?这种方法可以委托每个实施。