Session 關閉後,嘗試訪問未初始化的關聯集合/物件(代理),拋出 LazyInitializationException。
ElecUser user = list.get(0);
user.getElecRoles().size(); // 強制初始化集合
return user;
Hibernate.initialize(user.getElecRoles());
語義更清晰,同樣在 Session 開啟期間調用。
lazy="false")<set name="elecRoles" table="elec_user_role" lazy="false">
<key><column name="userID"/></key>
<many-to-many class="ElecRole" column="roleID"/>
</set>
缺點:關聯過多時會過度抓取,效能下降,不建議大量使用。
web.xml 配置(務必置於 Struts2 Filter 之前):
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.do</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
大頁面/高併發下 Session 持有時間過長,連接池耗盡導致「假死」,大數據量頁面慎用。
| 場景 | 推薦方案 |
|---|---|
| 少量關聯、明確使用點 | 方案一/二(顯式初始化) |
| 固定高頻關聯、可接受聯查 | 方案三(lazy=false) |
| 傳統 MVC、頁面導航複雜 | 方案四(OSIV)+ 監控連接池 |