zoukankan      html  css  js  c++  java
  • 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"删除即可。

  • 相关阅读:
    《使用Hibernate开发租房系统》内部测试笔试题
    C++第十课 字符串
    【011】字符数组
    C++第九课 数组
    C++第八课 局部变量和全局变量
    【010】递归函数
    C++第七课 函数2
    【009】阅读代码
    C++第六课 函数1
    【008】查找素数
  • 原文地址:https://www.cnblogs.com/llzgzljl/p/3019307.html
Copyright © 2011-2022 走看看