首页 > 代码库 > spring3.* + hibernate3.* 整合常见问题总结

spring3.* + hibernate3.* 整合常见问题总结

1、为了解决应用中的中文乱码问题,我们可以不用自己开发过滤器类,Spring为我们提供了一个,只需要配置一下即可:

  <!-- 解决乱码问题 -->
  <filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

该类的继承结构如下

  技术分享

该类如下

public class CharacterEncodingFilter extends OncePerRequestFilter {

  private String encoding;

  private boolean forceEncoding = false;


  public void setEncoding(String encoding) {
    this.encoding = encoding;
  }


  public void setForceEncoding(boolean forceEncoding) {
    this.forceEncoding = forceEncoding;
  }

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException  {

  if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null))

  {
    request.setCharacterEncoding(this.encoding);
    if (this.forceEncoding)

    {
      response.setCharacterEncoding(this.encoding);
    }
  }
    filterChain.doFilter(request, response);
  }

}

 

 

2、为了解决hibernate延迟加载的问题,使用Spring中提供的过滤器来解决,它能够让Session

  在请求解释完成之后再关闭,配置方式如下:

  同时解决Turn your Session into FlushMode.COMMIT/AUTO or remove ‘readOnly‘ marker from

  org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove ‘readOnly‘ marker from transaction definition. 

问题:只读模式下(FlushMode.NEVER/MANUAL)写操作不被允许:把你的Session改成FlushMode.COMMIT/AUTO或者清除事务定义中的readOnly标记。

  <filter> 
    <filter-name>OpenSessionInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
    <init-param> 
      <param-name>sessionFactoryBeanName</param-name> 
      <param-value>sessionFactory</param-value> 
    </init-param> 
    <init-param> 
      <param-name>singleSession</param-name> 
      <param-value>true</param-value> 
    </init-param>
    <init-param> 
      <param-name>flushMode </param-name> 
      <param-value>AUTO</param-value> 
    </init-param> 
  </filter>

该过滤器并不需要如下配置--> 配置之后就会出现删除或者修改不执行,添加,查询能够正常

  <filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3、因为OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。故进行insert、 update和delete操作时会产生异常:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove ‘readOnly‘ marker from transaction definition. 因此需要采用spring的事务声明,使方法受transaction控制:

 

<!-- 配置Spring的事务处理 -->
<!-- 创建事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>

 

<!-- 配置事务管理器应用的范围 -->

<!-- 配置AOP,Spring是通过AOP来进行事务管理的 -->
<aop:config>
  <!-- 设置pointCut表示哪些方法要加入事务处理 -->
  <!-- 以下的事务是声明在DAO中,但是通常都会在Service来处理多个业务对象逻辑的关系,注入删除,更新等,此时如果在执行了一个步骤之后抛出异常
  就会导致数据不完整,所以事务不应该在DAO层处理,而应该在service,这也就是Spring所提供的一个非常方便的工具,声明式事务 -->
  <aop:pointcut id="allMethods"
  expression="execution(* com.zhao.user.service.*.*(..))" />
  <!-- 通过advisor来确定具体要加入事务控制的方法 -->
  <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>

<!-- 配置Advice(事务的传播特性) 即:配置哪些方法要加入事务控制 -->

<tx:advice id="txAdvice" transaction-manager="txManager">
  <tx:attributes>
  <!-- 让所有的方法都加入事务管理,为了提高效率,可以把一些查询之类的方法设置为只读的事务 -->
  <tx:method name="*" propagation="REQUIRED" read-only="true"/>
  <!-- 以下方法都是可能设计修改的方法,就无法设置为只读 -->
  <tx:method name="add*" propagation="REQUIRED"/>
  <tx:method name="del*" propagation="REQUIRED"/>
  <tx:method name="update*" propagation="REQUIRED"/>
  <tx:method name="save*" propagation="REQUIRED"/>
  </tx:attributes>
</tx:advice>

 

4、部署应用程序,启动服务器,如果发现异常: java.lang.NoSuchMethodError:   org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V

  这是由于整合时Jar包的冲突引起的。应将"Web应用程序/WEB-INF/lib/asm-2.2.3.jar"删除即可

5.

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:420)

 

异常原因:缺少aspectjweaver.jar这个包,该包是spring集成AspectJ LTW织入器所需包

spring3.* + hibernate3.* 整合常见问题总结