Spring为我们解决Hibernate的Session的关闭与开启问题。
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 />??</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" 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 />??</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对象就不会关闭 所以就可以正常的去加载这些信息了注意这里的参数属设置