1. 程式人生 > >hibernate的懶載入的四種解決方式

hibernate的懶載入的四種解決方式

懶載入的產生原因:

當使用hibernate查詢一個物件的時候,如果Session關閉,在呼叫該物件關聯的集合或者物件的時候,會出現懶載入異常

解決方案(以使用者和角色為例):

方案一:

在session關閉之前,查詢物件關聯的集合或者物件,所有在業務層的方法上新增

public ElecUserfindUserByLogonName(String name) {

        String condition = " and o.logonName = ?";

        Object [] params = {name};

        List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition,params, null);

        //資料庫表中存在該使用者,返回ElecUser物件

        ElecUser elecUser = null;

        if(list!=null && list.size()>0){

            elecUser = list.get(0);

        }

        /***

         * 解決懶載入異常

        除了OID之外的其他屬性

         */

        elecUser.getElecRoles().size();

        return elecUser;

    }

方案二:

在sevice層的方法中(Sessio關閉之前),初始化物件關聯的集合或者物件

public ElecUserfindUserByLogonName(String name) {

        String condition = " and o.logonName = ?";

        Object [] params = {name};

        List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition,params, null);

        //資料庫表中存在該使用者,返回ElecUser物件

        ElecUser elecUser = null;

        if(list!=null && list.size()>0){

            elecUser = list.get(0);

        }

        /***

         * 解決懶載入異常

         */

        Hibernate.initialize(elecUser.getElecRoles());

        return elecUser;

    }

方案三:

在ElecUser.hbm.xml中,新增lazy="false",查詢使用者的同時,立即檢索查詢使用者關聯的角色集合

<set name="elecRoles" table="elec_user_role"inverse="true" lazy="false">

    <key>

        <column name="userID"></column>

    </key>

    <many-to-many class="cn.itcast.elec.domain.ElecRole" column="roleID"/>

</set>

方案四:

使用spring提供的過濾器OpenSessionInViewFilter,在web容器中新增該過濾器  

在web.xml中新增(要求:該過濾器一定要放置到struts2的過濾器的前面,先執行該過濾器)

<!-- 新增spring提供的過濾器,解決hibernate的懶載入問題 -->

    <filter>

        <filter-name>OpenSessionInViewFilter</filter-name>

        <filter-class>

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>OpenSessionInViewFilter</filter-name>

        <url-pattern>*.do</url-pattern>

        <url-pattern>*.jsp</url-pattern>

    </filter-mapping>

    <!-- 配置struts2的過濾器,這是struts2執行的核心 -->

    <filter>

        <filter-name>struts2</filter-name>

         <filter-class>

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>*.do</url-pattern>

        <url-pattern>*.jsp</url-pattern>

    </filter-mapping>