出現(xiàn)no session or session was closed這樣的異常不多解釋了,網(wǎng)上已經(jīng)一大堆。
但還是提不推薦把延遲加載特性去掉,而是必要時自己采取辦法得到想要的對象。這樣做更加靈活和效率高。雖然是避免不了一些代碼量。
之前采取的方案是在session未關(guān)閉之前,把其他表對象查詢出來并且clone。不過現(xiàn)在無意中發(fā)現(xiàn)其實(shí)hibernate其實(shí)已經(jīng)提供初始化的方法了,而未必自己去clone了。具體就是利用Hibernate.initialize() 這個方法。
例子如下:
但還是提不推薦把延遲加載特性去掉,而是必要時自己采取辦法得到想要的對象。這樣做更加靈活和效率高。雖然是避免不了一些代碼量。
之前采取的方案是在session未關(guān)閉之前,把其他表對象查詢出來并且clone。不過現(xiàn)在無意中發(fā)現(xiàn)其實(shí)hibernate其實(shí)已經(jīng)提供初始化的方法了,而未必自己去clone了。具體就是利用Hibernate.initialize() 這個方法。
例子如下:
/**
* 獲取Prescription中其他擴(kuò)展屬性對象。
*
* @param resultstruts2實(shí)現(xiàn)分頁按鈕
*/
private void initializeProperties(PaginationSupport<Prescription> result) {
List<Prescription> items = result.getItems();
if (items != null && !items.isEmpty()) {
List<Prescription> persistenceList = new ArrayList<Prescription>(
items.size());
for (Prescription prescription : items) {
Hibernate.initialize(prescription.getOffice());
Hibernate.initialize(prescription.getDoctor());
Hibernate.initialize(prescription.getDoctor().getOffice());
Hibernate.initialize(prescription.getHospitalDistrict());
Hibernate.initialize(prescription.getPatient());
persistenceList.add(prescription);
}
result.setItems(persistenceList);
}
}
* 獲取Prescription中其他擴(kuò)展屬性對象。
*
* @param resultstruts2實(shí)現(xiàn)分頁按鈕
*/
private void initializeProperties(PaginationSupport<Prescription> result) {
List<Prescription> items = result.getItems();
if (items != null && !items.isEmpty()) {
List<Prescription> persistenceList = new ArrayList<Prescription>(
items.size());
for (Prescription prescription : items) {
Hibernate.initialize(prescription.getOffice());
Hibernate.initialize(prescription.getDoctor());
Hibernate.initialize(prescription.getDoctor().getOffice());
Hibernate.initialize(prescription.getHospitalDistrict());
Hibernate.initialize(prescription.getPatient());
persistenceList.add(prescription);
}
result.setItems(persistenceList);
}
}
另還有種方法是采取spring的OpenSessionInViewFilter方法,把session關(guān)閉延遲到view層。不過我老是沒配成功 - - view層get擴(kuò)展表對象時還是提示no session。再說了還是覺得這樣的消耗有點(diǎn)大,因?yàn)榘阉胁樵兊膕ession關(guān)閉時間都加大了。很多時候只是某些查詢需要得到擴(kuò)展表對象而已,沒必 要把全部查詢都影響到吧。