1. 程式人生 > >SSH整合——Hibernate延遲載入引發的問題

SSH整合——Hibernate延遲載入引發的問題

這裡就是因為一開始載入Employee集合的時候,因為department屬性未被使用,所以採用了延遲載入。當在jsp頁面遍歷Employee集合的時候,此時就用到了department屬性,但是因為這裡採用的是getHibernateTemplate(),session是由Spring注入管理的。而此時session已經被Spring關閉,所以無法載入顯示。
解決方法1:配置hibernate時配置成不採用延遲載入lazy=“false”
解決方法二:新增如下程式碼

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name
>
<filterclass>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter< /filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.action</url-pattern
>
</filter-mapping>

該filter會將session繫結至當前請求的執行緒上,這樣只要是在當前請求的生命週期內,可以隨時訪問session。
新增完成後,可以正常顯示。
接著進行增加新員工資訊的時候報錯:
bug2:
這裡寫圖片描述
原因當前是隻讀模式,無法進行寫操作,因為我進行的是增加新使用者操作,所以使用了儲存操作.
兩種方法:
1,web.xml中註冊filter時,增加初始化引數(init-param,靈活性不高),進行修改
2,使用宣告式事務代理(靈活性很高,推薦)
此處為使用方便,採取第一種:`

    <init-param
>       <param-name>flushMode </param-name>       <param-value>AUTO</param-value>    </init-param>

結果還是同樣的錯誤。再次百度,原來OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設為FlushMode.NEVER。故進行insert、 update和delete操作時會產生異常。因此需要採用spring的事務宣告,使方法受transaction控制

對employee的service類新增事物管理後,新增正常

後來再次實驗新增的時候報錯
bug3:
這裡寫圖片描述

指我的employee引用了一個瞬時物件,請先儲存該物件在進行操作。
這裡寫圖片描述
經過排查,發現原來是我的部門沒有選擇,而且在jsp遍歷的時候

        <tr>
            <td>所屬部門:</td>
            <td><s:select name="department.did" list="list" listKey="did" listValue="dname" headerKey="" headerValue="---請選擇---"/>
            <td>編號:</td>
            <td><s:textfield name="eno" /></td>
        </tr>

headKey是指預設值。我設定為空了,這樣employee裡的department屬性相當於均為null,這樣好像是不被允許的,原因暫時不清楚。只要給它一個預設值就好了。