2

考虑一组具有与此类似的方法的 DOA

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

现在每个域 pojo ( Dom) 都有一个sessionId属性,并且对于域对象上的每个插入、更新或删除,都sessionId必须传递一个,setSessionId(Long sessionId)以便我们知道谁在做什么。但这似乎跨越了我们和我认为 AOP 将是插入sessionIda@Before(JoinPoint)@Around(ProceedingJoinPoint)建议的所有数据访问内容的好工具。这真的可行吗?DAO 大多是基于 Hibernate 和一些 Spring 的StoredProcedure

4

3 回答 3

1

DAO 层周围的拦截器将难以解释传递持久性,即级联到关联实体的休眠操作(保存、删除、...)。Hibernate 会话拦截器可以。

在任何情况下,如果您的拦截器能够以某种方式发现当前会话 ID,则可以采用任何一种方式。

于 2009-10-05T21:49:00.557 回答
1

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

您是否想过将 public void addObject(Long sessionId, Long clientId, Dom obj){...} 放在父亲/上层班级中?这个方法可以委托给每个实现..

于 2009-10-06T20:36:25.780 回答
1

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

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

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

于 2009-10-08T10:13:49.990 回答