hibernate懶載入導致多表聯合查詢失敗

-大能豆-發表於2017-06-05

由於hibernate預設啟用懶載入策略,若session關閉後則無法使用查詢的內容。比如 一個部門有多個職務,一個職務有多個員工,當我們查詢員工時,需要顯示其職務和部門,如圖
啊啊啊
資料庫為:
1
2
3

若service層的程式碼為

public List<CrmStaff> findAllStaff() {
        return staffDao.findAll();
    }

然後去JSP頁面取資料時,部門和職務不顯示。因為session已經關閉了。
JSP頁面部分程式碼:

<s:iterator value="#allStaff">    
      <tr class="tabtd2"> 
        <td align="center"><s:property value="staffName"/></td>
        <td align="center"><s:property value="gender"/></td>
        <td align="center"><s:date name="onDutyDate" format="yyyy-MM-dd"/></td>
        <td align="center"><s:property value="post.department.depName"/></td>
        <td align="center"><s:property value="post.postName"/></td>
        <td width="7%" align="center">
            <a href="${pageContext.request.contextPath}/pages/staff/editStaff.jsp"><img src="${pageContext.request.contextPath}/images/button/modify.gif" class="img" /></a>    
        </td>
      </tr>
    </s:iterator> 

解決思路1: 在員工表和職務表中取消懶載入,從而查詢員工時 同時 查出職務 ,查詢職務時 同時 查出部門。此方法只能查出員工的職務,無法查出部門。

員工.hbm.xml配置
<!-- 多對一:多個員工 屬於 【一個職務】 -->
        <many-to-one name="post" class="com.hantao.crm.post.domain.CrmPost" column="postId" lazy="true"></many-to-one>
職務.hbm.xml配置
<!-- 多對一:多個職務 屬性 【一個部門】 -->
        <many-to-one name="department" class="com.hantao.crm.department.domain.CrmDepartment" column="depId" lazy="true"></many-to-one>

解決思路2: 使用spring的延遲session關閉功能,從而使jsp頁面取資料時session還沒關閉。成功。

<!--3 spring 過濾器,延遲session關閉-->
    <filter>
        <filter-name>openSession</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSession</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

解決思路3: 在service層中get一下將來要使用的資料,從而在session關閉前取得資料。成功。

public List<CrmStaff> findAllStaff() {
        List<CrmStaff> temp = staffDao.findAll();
        for (CrmStaff crmStaff : temp) {
            //列印每個員工的部門名稱
            System.out.print(crmStaff.getPost().getDepartment().getDepName());
        }
        return temp;
    }

相關文章