hibernate一对多出现failed to lazily initialize a collection of role异常!
1.这是关于延迟加载的问题
<set name="news" inverse="true">
<key column="typeId"></key>
<one-to-many class="com.auj.sshdemo.bean.News"/>
</set>
改成:
<set name="news" inverse="true" cascode="all" lazy="false">
<key column="typeId"></key>
<one-to-many class="com.auj.sshdemo.bean.News"/>
</set>
cascode="all"
这也就使用了级联,代表在你查询主表的数据的时候,也去查询子表的数据。设置成all也就代表对主表的select,delete,update,save的时候,也要对进行相应的操作。在hibernate的session在假如以查询来讲,当你查询了主表的完成后,session关闭。这是字表的数据没有去数据库中查询。所以会报错!
lazy="false”
加上这个也就代表了非延迟加载,这样session也就不会关闭。
cascode的设置要根据需要使用,主要是考虑效率问题!
<set name="news" inverse="true">
<key column="typeId"></key>
<one-to-many class="com.auj.sshdemo.bean.News"/>
</set>
改成:
<set name="news" inverse="true" cascode="all" lazy="false">
<key column="typeId"></key>
<one-to-many class="com.auj.sshdemo.bean.News"/>
</set>
cascode="all"
这也就使用了级联,代表在你查询主表的数据的时候,也去查询子表的数据。设置成all也就代表对主表的select,delete,update,save的时候,也要对进行相应的操作。在hibernate的session在假如以查询来讲,当你查询了主表的完成后,session关闭。这是字表的数据没有去数据库中查询。所以会报错!
lazy="false”
加上这个也就代表了非延迟加载,这样session也就不会关闭。
cascode的设置要根据需要使用,主要是考虑效率问题!
解决方案二:
<set name="news" inverse="true" cascode="all" fetch="join">
<key column="typeId"></key>
<one-to-many class="com.auj.sshdemo.bean.News"/>
</set>
这样就会执行一条表连接语句,避免问题的出现
<set name="news" inverse="true" cascode="all" fetch="join">
<key column="typeId"></key>
<one-to-many class="com.auj.sshdemo.bean.News"/>
</set>
这样就会执行一条表连接语句,避免问题的出现