當然,跟任何其它優秀的技術一樣,JPA也不是完美的,在使用的過程中難免都會出這樣那樣的問題,這就需要我們程序員具有格物致知的本領,在應用中靈活應付這些問題。 這里例舉一個緩遲加載的問題,以上面的新聞目錄Entity為例。對于parnet與children這個一對多的雙向關聯,為了提高系統效率,children默認使用的是緩遲加載的方式。在一些輕量級的構架中,由于脫離了J2EE容器及事務支持,經常會出現Entity脫離了Persitence Context,變成了detach或EntityManager關閉,導致一些我們預想中的一些功能無法正常運行。 最常見的就是在使用MVC框架的時候,在表示層無法加載需要緩遲加載的數據。比如,在一個基于EasyJWeb的mvc應用中,action中的方法如下:
在模板文件中有如下內容:#foreach($info in ${dir.children})目錄名稱:${info.title}#end
關于業務邏輯層Bean的配置:
?
在這里,當mvc層執行到$!info.getChildren()方法的時候,將會用到緩遲加載,由于Spring的事務是配置在service層的,因此在執行service.queryDirsByConditions方法完成后就關閉了事務。因此運行程序就會出現類似下面的錯誤信息:
使用其它的mvc如struts、webwork乃至spring mvc都會有這樣的問題,問題的核心是在事務啟動及結束上,由于我們都習慣于在service層而非mvc配置及使用事務,導致了這樣的問題。解決的辦法其實很簡單,就是把事務的啟動放到mvc層,讓mvc層的controller來開啟事務,而讓業務層的方法加入的事務中。比如,在EasyJWeb中,可以通過如下的配置來實現實現在action中開啟事務: 在Spring配置文件中配置EasyJWeb的核心處理器,并把process方法添加到事務中,配置文件如下:
只需要這樣簡單的配置,你會驚奇的發現,所有緩遲加載及其它由Persitence Context無效而引起的問題均解決了。
?????? 關于easyjweb與spring的集成,有興趣的朋友請參考stef_wu的《在EasyJWeb使用spring容器》一文。
(本文作者:EasyJF開源??大峽 歡迎轉載,轉載請保留作者聲明,謝謝!)