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 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对象就不会关闭 所以就可以正常的去加载这些信息了
注意这里的参数属设置

相关推荐