十三、解决懒加载

  懒加载几种情况(方式) 首先我们要明确一点 Domain Object 是非final的,才能实现懒加载。

  解决懒加载的方法:

1. 明确初始化 在session还没有关闭时,访问一次 xxx.getXxx(),强制访问数据库。或者 Hibernate.initialize(xxx)

   1.1在登录验证的时候,显示访问

//登录验证,如果验证成功则返回该employee对象,否则返回空
    public Employee loginCheck(Employee e) {
        // TODO Auto-generated method stub
        String hql="from Employee where id=? and password=?";
        List<Employee> list = sessionFactory.getCurrentSession().createQuery(hql).setInteger(0, e.getId()).setString(1, e.getPassword()).list();
        
//        //显示初始化懒加载,但是好像不起作用,不如强制访问getDepartment().getName()
//        Hibernate.initialize(Department.class);
        
        //在登录验证的时候,此时session创建好了去数据库查登录信息,还没关闭,我们强制让session帮我们查查部门信息
        list.get(0).getDepartment().getName();
        
        if(list.size()>0) return list.get(0);
        else return null;
    }

  

2. 在对象映射文件中配置,lazy=“false”

    2.1在Department.hbm.xml文件中

<hibernate-mapping package="com.myz.domain">
    <class name="Department" table="department" lazy="false">
        <cache usage="read-write"/>
        <id name="id" type="java.lang.Integer">
            <generator class="assigned"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name"></column>
        </property>
        
        <!-- 一个部门可以有多个雇员-->
        <set name="emps" cascade="save-update">
            <key column="department_id"></key>
            <one-to-many class="Employee"/>
        </set>
    </class>
</hibernate-mapping>

  以上两种方法都不太好,因为不管我们的jsp用不用loginUser.department.Name,它们在登录的时候都会发出sql语句去查询,如果我们不知道用不用,而希望需要的时候它再发出sql语句查询,请用以下方法

3. 在ssh中,可以实现在service层,标注方式解决懒加载.

4. openSessionInView 这个往往需要过滤器配合使用(web程序)。

    4.1在web.xml文件中,添加过滤器

<!-- 配置 OpenSessionInViewFilter解决懒加载,本质是过滤器,延长事务处理的时间,即延长session的生命周期-->
    <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>/*</url-pattern>
    </filter-mapping>
原文地址:https://www.cnblogs.com/myz666/p/8439009.html