2009-10-05 76 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){...} 在父級/上級類中?這種方法可以委託每個實施。