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





















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






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













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