hibernate的懒加载的四种解决方式

来源:互联网 发布:外国人聊天的软件 编辑:程序博客网 时间:2024/05/14 03:19

懒加载的产生原因:

当使用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>



0 0
原创粉丝点击