在MVC框架中,以前經(jīng)典的都是用struts/webwork+Hibernate+Spring來做的。但這樣做在延遲加載時(shí)會(huì)有個(gè)問題,即:
serviceA中通過DAO從數(shù)據(jù)庫里取得一些實(shí)例化的Model供Action使用,在service返回后,后臺(tái)hibernate的session實(shí)際就結(jié)束了。若使用了延遲加載,此時(shí)再想訪問這些具備one-to-many映射的model的“多”的一方時(shí)就會(huì)扔出異常,報(bào)告session已關(guān)閉,即使fetchType.EAGER也一樣。正因?yàn)槿绱耍琒pring才提出一個(gè)OpenSessionInView的解決辦法,但該辦法實(shí)際也不是萬能的,有時(shí)一樣出錯(cuò)。這種情況在EJB3也是存在的,當(dāng)實(shí)體Bean返回給客戶端的時(shí)候,這時(shí)的實(shí)體Bean已經(jīng)脫離了容器的管理,若使用了延遲加載,在獲取“多”的一方時(shí)就會(huì)扔出異常,要想解決這個(gè)問題,在EJB3.0中可以在返回給客戶端前先加載“多”的一方,如:order.getOrderItems().size(); 。另外你也可以使用fetchType.EAGER屬性明確指出在得到“一”的同時(shí)得到“多”,這在EJB3中是OK的。還可以使用join fetch語句同時(shí)得到“