Hibernate级联查询时,如果对于级联对象的lazy属性配置为true,那么在真正使用到级联对象时,会出现session关闭的提示。
解决的方法一般有两种:
1,将lazy属性设置为false。这种做法不是讨论的重点,如果设置为false,那么延迟加载就毫无意义,相当于回避了问题。
2,利用Open Session In View 的Filter,例如Spring就提供了该Filter,很多资料都提供了该用法。但是据说会有不少的副作用。
 
为什么会出现session关闭的提示?
例如,对于parent.getChildren()这样一个方法来说,parent对象是一开始就通过Hibenate对象拿到的,但是由于<one-to-many>的lazy属性设置为false,在get parent这个对象时候,并没有拿到其children。当真正用到children的时候,此时的parent已经变成托管状态的了,在托管态的对象是无法再次使用级联操作的。
所以另外一种解决就是重新关联parent到session,然后执行一下getChildren(),当parent再次变成托管状态时,就不会出错了。
 
重新获得一个session,然后利用session.update(parent),将其重新关联,变成持久态。在执行一下parent.getChildren()。
这里需要注意另外一个问题,update时,会不会出现级联更新?