2013-12-11 77 views
1

我使用的是spring 3.2 spring security和hibernate 3.4.0。有沒有解決方案來避免LazyInitializationException

當我的用戶登錄時,我將用戶存儲在我的自定義主體中。

在應用程序的後面,我想訪問與我的用戶關聯的集合。 所以我做的:

User u = ((MyCustomPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser(); 
u.getMyCollection(); 

和我得到的過程中LazyInitException。 所以我臨時的解決辦法是重新獲取用戶:通過這樣做它的工作原理

User u = ((MyCustomPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser(); 
u = userDao.find(u.getId()); 
u.getMyCollection(); 

,但我覺得這並不是一個非常優化的解決方案,因爲我的用戶OWS 4分集,所以我就在被迫去取用戶從db多次在不同的地方(在我的自定義身份驗證器,在攔截器,在我的控制器...)。

有沒有解決這個問題像全球交易或什麼的?

感謝

+0

可能重複在Spring使用JPA/Hibernate的,我該如何保持一個會話打開,以避免延遲初始化例外?](http://stackoverflow.com/questions/1139985/in-spring-with-jpa-hibernate-how-do-i-keep-a-session-open-to-avoid-lazy-initial) –

回答

0

當我的用戶登錄我在自定義主體

存儲用戶在登錄的代碼,你取從userDAO的用戶在第一時間點,只是添加user.getMyCollection()呼叫。這將獲取關聯的集合並將其存儲在用戶對象中。當您稍後訪問SecurityContextHolder時,不會拋出LazyIntializationException

+0

確定但這幾乎就像使用lazy = false ... – jpprade

+0

這是一個可怕的解決方案。它會每次都會連接到一個懶惰的連接,即使沒有必要 – Marc

1

你可以嘗試合併分離的用戶將當前會話:

User u = ((MyCustomPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUser(); 
u = userDao.merge(u); 
u.getMyCollection(); 

http://docs.jboss.org/hibernate/entitymanager/3.4/reference/en/html/objectstate.html#d0e891

的[
+0

只是試過了,但我在日誌中看到了一個選擇,所以它與我正在做的相同 – jpprade

+1

您可以加載用戶及其集合在一開始就渴望提取。但我建議你在會話中存儲一個簡單的對象(用戶名和其他簡單信息),而不是休眠對象(大和重)。在需要時不要害怕向數據庫要求 – polypiel

相關問題