懒加载几种情况(方式) 首先我们要明确一点 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>