?????? 下面是一個簡單的Entity,是對一個CMS系統(tǒng)中,關(guān)于樹狀信息目錄實體類的定義,包括了一些詳細(xì)的映射的配置信息。





















當(dāng)然,跟任何其它優(yōu)秀的技術(shù)一樣,JPA也不是完美的,在使用的過程中難免都會出這樣那樣的問題,這就需要我們程序員具有格物致知的本領(lǐng),在應(yīng)用中靈活應(yīng)付這些問題。
這里例舉一個緩遲加載的問題,以上面的新聞目錄Entity為例。對于parnet與children這個一對多的雙向關(guān)聯(lián),為了提高系統(tǒng)效率,children默認(rèn)使用的是緩遲加載的方式。在一些輕量級的構(gòu)架中,由于脫離了J2EE容器及事務(wù)支持,經(jīng)常會出現(xiàn)Entity脫離了Persitence Context,變成了detach或EntityManager關(guān)閉,導(dǎo)致一些我們預(yù)想中的一些功能無法正常運行。
最常見的就是在使用MVC框架的時候,在表示層無法加載需要緩遲加載的數(shù)據(jù)。比如,在一個基于EasyJWeb的mvc應(yīng)用中,action中的方法如下:










在模板文件中有如下內(nèi)容:
#foreach($info in ${dir.children})
目錄名稱:${info.title}
#end
關(guān)于業(yè)務(wù)邏輯層Bean的配置:
?



















在這里,當(dāng)mvc層執(zhí)行到$!info.getChildren()方法的時候,將會用到緩遲加載,由于Spring的事務(wù)是配置在service層的,因此在執(zhí)行service.queryDirsByConditions方法完成后就關(guān)閉了事務(wù)。因此運行程序就會出現(xiàn)類似下面的錯誤信息:






使用其它的mvc如struts、webwork乃至spring mvc都會有這樣的問題,問題的核心是在事務(wù)啟動及結(jié)束上,由于我們都習(xí)慣于在service層而非mvc配置及使用事務(wù),導(dǎo)致了這樣的問題。解決的辦法其實很簡單,就是把事務(wù)的啟動放到mvc層,讓mvc層的controller來開啟事務(wù),而讓業(yè)務(wù)層的方法加入的事務(wù)中。比如,在EasyJWeb中,可以通過如下的配置來實現(xiàn)實現(xiàn)在action中開啟事務(wù):
在Spring配置文件中配置EasyJWeb的核心處理器,并把process方法添加到事務(wù)中,配置文件如下:
?













只需要這樣簡單的配置,你會驚奇的發(fā)現(xiàn),所有緩遲加載及其它由Persitence Context無效而引起的問題均解決了。
?????? 關(guān)于easyjweb與spring的集成,有興趣的朋友請參考stef_wu的《在EasyJWeb使用spring容器》一文。