1. 也是最討厭的:NullPointerException。在整合SSH中經常出現的莫過于NullPointerException了,導致這種錯的原因很多。bean的注入問題,也就是spring的配置文件中的錯誤;struts2和spring的整合問題,如果整合出現問題也會出現這種錯誤。關于第二種情況要多說一點了,因為今天我遇到了這個錯誤。其實也是常識性的錯誤struts2沒有整合spring的應用。
這里簡單說一下struts2和spring整合的問題:首先struts2方面應該引入struts2-spring-plugin-2.2.1.jar和其他struts2
所必需的包,然后就是配置文件中struts.xml應該加入:<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />表示和spring的整合。
我覺得還是有必要詳細的描述一下今天我遇到的問題:我通過spring配置的action類中的方法通過Junit可以測試成功,但是jsp頁面訪問的時候產生了NullPointerException,費了半天的勁才發現是這種錯誤!!不過錯誤解決了心里聽高興的??!
2.
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()。這個錯誤也挺容易出現的。這個錯誤產生的原因是將阿寶的沖突。antlr-2.7.6.jar在struts2和hibernate中都有,分別使用框架的時候沒問題但是如果整合起來就會出現這樣的問題,去掉一個較低版本的就可以了!
3. 配置攔截器后表單參數不能實例化!!這是什么原因呢?這個問題的原因涉及到struts的自動裝載機制,但是解決方案挺簡單的,將struts2的默認攔截器也配置上??!如果應用中沒有配置攔截器表單傳遞過來的參數是不能自動裝載成為對象的!!
4. hibernate的session管理問題:Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL)
!這是使用spring的opensessioninview引起的異常??!網上的方案挺多的,我使用了這種方案:
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
<param-name> flushMode </param-name>
<param-value>AUTO </param-value>
</init-param>
還有一種方案要在spring的配置文件中配置:
<bean id="baseTransaction"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
5.關于hibernate的復雜交叉的映射關系。今天遇到了org.springframework.orm.hibernate3.HibernateSystemException: IllegalArgumentException occurred while calling setter of org.blog.po.User.ulog; nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of org.blog.po.User.ulog 這樣的錯誤(錯誤類型一樣,但是具體信息不一樣)。錯誤信息中提示type mismatch:類型不匹配。我就一直納悶因為我檢查了好幾遍,完全沒問題呀!最后還是找到了問題的根源。我先說明一下這個關聯關系:關聯對象,用戶和組;用戶可以創建一個組,一個組中有多個用戶。聽起來還是蠻簡單的,但是錯誤出現了。
分析一下原因:因為當初我考慮到效率的問題用的是雙向的關聯關系,其實這也就是出錯的根源,用戶與組之間存在兩種關聯關系,hibernate不能分清楚用戶誰是創建者誰是用戶,所以出現了這樣的問題。干脆拋棄雙向的關系,雙方都使用單向的關系,問題解決了?。?/p>
6.這個錯誤信息是這樣的:nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update。我到網上搜了一下這個個問題的答案:(1)因為
Hibernate Tools
(或者
Eclipse
本身的
Database Explorer
)生成
*.hbn.xml
工具中包含有
catalog="***"
(
*表示數據庫
名稱)這樣的屬性,所以數據庫遷移到其它數據庫就會產生這樣的錯誤。(2)數據表中的字段與hibernate映射文件中的屬性配置沖突,造成插入無法進行。
最后我說一下我的錯誤:我的錯誤其實和第二種類似,我創建了一個名為Limit的類,不知道這是mysql的關鍵字,還是hibernate的關鍵字,hibernate沒有幫我自動生成這個limit數據表,所以...
7.關于
org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions的錯誤!!這個錯誤也是讓我煞費苦心,搞了差不多將近兩個多小時??!試盡了我想到的可能解決這個問題的方法,但是畢竟還是小鳥一只...結果你懂得!!但是老鳥還是遍地飛呀...
哦哦...忘了說明錯誤出現的場景了:組織---個人(多對多關系),更新組織中成員的時候出現了這個錯誤,更新我用的update方法!!好吧下面說一下解決方案:只要把update換成merg就ok了??!
簡單介紹一下merge方法:
merge方法
調用merge方法的時候,hibernate會檢查在持久化上下文中的持久化實例是否和脫管實例具有相同的標識符。如果有,把脫管實例的狀態負責到持久化實例中;如果沒有,就從數據庫中加載,然后把脫管實例和獲取的對象狀態合并;如果數據庫中沒有查到結果,就創建新的持久化實例,把脫管實例的狀態復制到新實例,插入到數據庫中,并通過merge()操作返回。
我覺得我還有必要記錄一下我解決錯誤時的方案:我首先想到的是hibernate懶加載惹的禍,因為我在hbm配置文件中配置了lazy懶加載。但是問題還是沒有解決。于是我把update(Team team, String tid)方法修改為update(Set<User> users, String tid),問題還是不得解決,于是完全否定了是懶加載的問題!但是對于上面的這種方案我還是不太理解,SSH的session問題肯定是一個大問題?。?/p>
未完待續......