在
<many-to-on>
中這錯誤很常見,字面意義就是不能被初始化,因為
session
已經關閉了。
簡單理解就是因為,
你使用了
lazy=true
,
這樣
hibernate
在從數據庫中調數據的時候是不會
把關聯的對象查出來的,而是保存一個獲取值得方法,在你使用
getXXX()
調用的時候,
hiberante
會利用這個保存的方法去從數據庫中取數據。而往往我們在
jsp
頁面中使用
getXXX()
准備展示數據的時候,
session
早已經在
dao
中就關閉了,
我們該如何解決這種異
常呢?
簡單的說有三種:
1.
把
lazy
設成
false,
最
2
的辦法,但是最簡單,簡單就是美嘛,也依然會有很多再使用這個
方式再解決類似問題。
2.
我沒試過,但聽說過,應該可行
.
在
web.xml
中加入
程序代碼
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
3.
我用的方法,
也是我認為比較不錯的方法,
靈活性更好。
用
left join fetch
或
inner join fetch
語法。
例如:
from Item i left join fetch i.parentItem ii
解釋一下
Item
表是一個自關聯的表,它的關聯關系在
hbm.xml
中配置好了。
如下:
程序代碼
<many-to-one name="parentItem" lazy="false" fetch="join"
class="cn.sports.matchs.model.Item">
<column name="PARENT_ID"></column>
</many-to-one>
在
Item
類中
程序代碼
private Item parentItem;