Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。
当我们需要在jsp页面中使用一个比方说:
teacher.students输出的时候 我们会发现org.hibernate.LazyInitializationException:(LazyInitializationException.java:42)
有这样一个关于延迟加载的异常
那么这是hibernate的延迟加载的缘故 下面我们看一下hibernate关联配置
<class name="Teacher" table="tbl_teacher">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<property name="sex" type="string">
<column name="sex"></column>
</property>
<property name="phone" type="java.lang.String">
<column name="PHONE" />
</property>
<property name="adress" type="java.lang.String">
<column name="ADRESS" />
</property>
<many-to-one name="course" class="Course" fetch="join"
not-found="ignore">
<column name="course" />
</many-to-one>
<set name="students" cascade="all" order-by="id desc">
<key column="teacher_id"></key>
<one-to-many class="Student" />
</set>
</class>
在这个teacher的实体类中我们有一个students的集合 当我们为他配置lazy="true"
的延迟加载的时候 那么它的默认值就是true 当我们在页面中使用teacher。students的时候 就会出现延迟加载的异常
那么我们可以手动的去设置这个值为false
那么可想而知一旦这样的情形多的时候 我们就需要设置很多 所以第二种我们就需要配置一个spring中的
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>这里的设置是事务的作用 详细可以查看FlushMode hibernate的几种状态
<param-name>FlushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>localSessionFactoryBean</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
这样相当于当我们在使用teacher.students的时候 我们的session对象就不会关闭 所以就可以正常的去加载这些信息了
注意这里的参数属设置