JAVA中nosession问题,使用Hibernate.initialize解决no session的延迟加载问题

出现no session or session was closed这样的异常不多解释了,网上已经一大堆。

但还是提不推荐把延迟加载特性去掉,而是必要时自己采取办法得到想要的对象。这样做更加灵活和效率高。虽然是避免不了一些代码量。

之前采取的方案是在session未关闭之前,把其他表对象查询出来并且clone。不过现在无意中发现其实hibernate其实已经提供初始化的方法了,而未必自己去clone了。具体就是利用Hibernate.initialize() 这个方法。

例子如下:

/**

* 获取Prescription中其他扩展属性对象。

*

* @param resultstruts2实现分页按钮

*/

private void initializeProperties(PaginationSupport result) {

List items = result.getItems();

if (items != null && !items.isEmpty()) {

List persistenceList = new ArrayList(

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关闭延迟到view层。不过我老是没配成功 - -  view层get扩展表对象时还是提示no session。再说了还是觉得这样的消耗有点大,因为把所有查询的session关闭时间都加大了。很多时候只是某些查询需要得到扩展表对象而已,没必 要把全部查询都影响到吧。

posted on 2011-06-29 09:50 墙头草 阅读(2539) 评论(0)  编辑  收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值