我正在使用Wicket和自定義的PageAuthorizationStrategy訪問數據庫以獲取有關當前用戶的信息,從而訪問他的訪問權限。每個請求都被Spring Open-Session-In-View過濾器打包以打開/關閉Hibernate會話。檢票,身份驗證和事務劃分
這對讀取數據庫非常有效。無論何時需要寫操作,我都會調用使用Spring的基於註釋的事務處理的服務層。這也適用,但我認爲這是一個特定的錯誤的原因:當一個對象在請求A中進行身份驗證期間加載,然後在另一個請求B中進行修改,然後切換到請求A中的服務層時,服務層正在處理錯誤的值,因爲Hibernate和底層數據庫都不能確保隔離。由於我一直在努力與數據庫/交易理論的具體細節,請糾正我,如果這個假設已經是錯誤的。
我的解決方案的第一個想法是在寫入事務啓動後刷新爲加載身份驗證的對象。儘管當由服務修改的對象同時需要認證時,這會引起問題。當Wicket使用表單中的變化數據填充對象並在提交方法中將其傳遞給服務時(例如),就會發生這種情況。
所以很可能,這樣做的正確方法是確保身份驗證代碼已被包裝在與可能在同一請求期間執行的任何寫入代碼相同的事務中。
我該如何解決這個Wicket中的「正確方法」?
編輯:這個問題變得更加的問題,因爲我意識到,當事務服務方法在引發異常後回滾時,視圖層會導致LazyInitializationException。顯然,Spring的TransactionManager會清除會話和/或Hibernate/Spring深處的其他內容,因爲我可以從數據庫重新加載對象,但試圖加載包含在該對象中的集合導致所述異常。任何想法如何去做這件事?如果有一種使用「每次請求一次處理」的優雅方式,我想這一切都將得到解決。