延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。 其实很简单,它使用了代理机制。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用getter方法时就会去数据库加载数据。 但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。这种情况就叫做未初始化的关系。 / y3 f+ L- ]& N4 r: \6 R; ]' b- Z7 Y
1)、关闭延迟加载特性。
5 B4 V, G# v! c2 g1 N9 t, U% W操作起来比较简单,因为hibernate的延迟加载特性是在hbm配置里面可控制的。默认lazy="true",改为lazy="false"就可以了。
. v9 f1 O9 u+ V但是使用这个解决办法带来的隐患是十分大的。
1 p `1 ~8 c5 {9 P. [3 |首先,出现no session or session was closed就证明了您已经在使用外键关联表,如果去掉延迟加载的话,则表示每次查询的开销都会变得十分的大,如果关联表越多,后果也可以想象得到。所以不建议使用这个方法解决。 2)、在session关闭之前把我们想要查询的数据先获取了。5 @2 m8 `+ |" X, q3 u
首先需要了解一下session什么时候关闭,也就是它的生命周期。通常情况下hibernate会在查询数据关闭session,而使用getHibernateTemplate().get方法查询后会延迟关闭的时间。会在事务结束后才关闭。
, y, i( j4 Z) n: {* s# w |