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"刪除即可。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM