考虑一组具有与此
类似的方法的DOApublic 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 :(得分:1)
DAO层周围的拦截器将难以计算传递持久性,即hibernate操作(保存,删除,...)级联到关联实体。 Hibernate会话拦截器可以。
在任何情况下,如果您的拦截器能够以某种方式发现当前会话ID,则可以采用任何一种方式。
答案 1 :(得分:1)
我不明白为什么你不能这样做,我实际上在过去做过类似的事情(有点复杂),帮助我不要对每一堂课进行交叉重构!
你有没有考虑过推杆 public void addObject(Long sessionId,Long clientId,Dom obj){...} 在父亲/上层阶级?这个方法可以委托每个实现..
答案 2 :(得分:1)
您的sessionId参数似乎属于审核方面。在Hibernate中,此审核方面通常在org.hibernate.Interceptor的实现中实现。
您可以为实体和查询实现许多与生命周期事件相对应的方法。在您的实现中,很容易访问您当前的sessionId(它可以使用ThreadLocal变量)。清晰,干净,快速; - )
这可能比使用AOP自己做的更简单,特别是当您从Hibernate获取生命周期事件的回调时。