使用Hibernate.initialize解决no session的延迟加载问题
出现no session or session was closed这样的异常不多解释了,网上已经一大堆。
但还是提不推荐把延迟加载特性去掉,而是必要时自己采取办法得到想要的对象。这样做更加灵活和效率高。虽然是避免不了一些代码量。
之前采取的方案是在session未关闭之前,把其他表对象查询出来并且clone。不过现在无意中发现其实hibernate其实已经提供初始化的方法了,而未必自己去clone了。具体就是利用Hibernate.initialize() 这个方法。
例子如下:
/** * 获取Prescription中其他扩展属性对象。 * * @param result */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);}}