1. 也是最討厭的:NullPointerException。在整合SSH中經(jīng)常出現(xiàn)的莫過于NullPointerException了,導(dǎo)致這種錯(cuò)的原因很多。bean的注入問題,也就是spring的配置文件中的錯(cuò)誤;struts2和spring的整合問題,如果整合出現(xiàn)問題也會(huì)出現(xiàn)這種錯(cuò)誤。關(guān)于第二種情況要多說一點(diǎn)了,因?yàn)榻裉煳矣龅搅诉@個(gè)錯(cuò)誤。其實(shí)也是常識(shí)性的錯(cuò)誤struts2沒有整合spring的應(yīng)用。
這里簡(jiǎn)單說一下struts2和spring整合的問題:首先struts2方面應(yīng)該引入struts2-spring-plugin-2.2.1.jar和其他struts2
所必需的包,然后就是配置文件中struts.xml應(yīng)該加入:<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />表示和spring的整合。
我覺得還是有必要詳細(xì)的描述一下今天我遇到的問題:我通過spring配置的action類中的方法通過Junit可以測(cè)試成功,但是jsp頁面訪問的時(shí)候產(chǎn)生了NullPointerException,費(fèi)了半天的勁才發(fā)現(xiàn)是這種錯(cuò)誤!!不過錯(cuò)誤解決了心里聽高興的!!
2.
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()。這個(gè)錯(cuò)誤也挺容易出現(xiàn)的。這個(gè)錯(cuò)誤產(chǎn)生的原因是將阿寶的沖突。antlr-2.7.6.jar在struts2和hibernate中都有,分別使用框架的時(shí)候沒問題但是如果整合起來就會(huì)出現(xiàn)這樣的問題,去掉一個(gè)較低版本的就可以了!
3. 配置攔截器后表單參數(shù)不能實(shí)例化!!這是什么原因呢?這個(gè)問題的原因涉及到struts的自動(dòng)裝載機(jī)制,但是解決方案挺簡(jiǎn)單的,將struts2的默認(rèn)攔截器也配置上!!如果應(yīng)用中沒有配置攔截器表單傳遞過來的參數(shù)是不能自動(dòng)裝載成為對(duì)象的!!
4. hibernate的session管理問題:Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL)
!這是使用spring的opensessioninview引起的異常!!網(wǎng)上的方案挺多的,我使用了這種方案:
<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.關(guān)于hibernate的復(fù)雜交叉的映射關(guān)系。今天遇到了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 這樣的錯(cuò)誤(錯(cuò)誤類型一樣,但是具體信息不一樣)。錯(cuò)誤信息中提示type mismatch:類型不匹配。我就一直納悶因?yàn)槲覚z查了好幾遍,完全沒問題呀!最后還是找到了問題的根源。我先說明一下這個(gè)關(guān)聯(lián)關(guān)系:關(guān)聯(lián)對(duì)象,用戶和組;用戶可以創(chuàng)建一個(gè)組,一個(gè)組中有多個(gè)用戶。聽起來還是蠻簡(jiǎn)單的,但是錯(cuò)誤出現(xiàn)了。
分析一下原因:因?yàn)楫?dāng)初我考慮到效率的問題用的是雙向的關(guān)聯(lián)關(guān)系,其實(shí)這也就是出錯(cuò)的根源,用戶與組之間存在兩種關(guān)聯(lián)關(guān)系,hibernate不能分清楚用戶誰是創(chuàng)建者誰是用戶,所以出現(xiàn)了這樣的問題。干脆拋棄雙向的關(guān)系,雙方都使用單向的關(guān)系,問題解決了!!
6.這個(gè)錯(cuò)誤信息是這樣的:nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update。我到網(wǎng)上搜了一下這個(gè)個(gè)問題的答案:(1)因?yàn)?/span>
Hibernate Tools
(或者
Eclipse
本身的
Database Explorer
)生成
*.hbn.xml
工具中包含有
catalog="***"
(
*表示數(shù)據(jù)庫(kù)
名稱)這樣的屬性,所以數(shù)據(jù)庫(kù)遷移到其它數(shù)據(jù)庫(kù)就會(huì)產(chǎn)生這樣的錯(cuò)誤。(2)數(shù)據(jù)表中的字段與hibernate映射文件中的屬性配置沖突,造成插入無法進(jìn)行。
最后我說一下我的錯(cuò)誤:我的錯(cuò)誤其實(shí)和第二種類似,我創(chuàng)建了一個(gè)名為L(zhǎng)imit的類,不知道這是mysql的關(guān)鍵字,還是hibernate的關(guān)鍵字,hibernate沒有幫我自動(dòng)生成這個(gè)limit數(shù)據(jù)表,所以...
7.關(guān)于
org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions的錯(cuò)誤!!這個(gè)錯(cuò)誤也是讓我煞費(fèi)苦心,搞了差不多將近兩個(gè)多小時(shí)!!試盡了我想到的可能解決這個(gè)問題的方法,但是畢竟還是小鳥一只...結(jié)果你懂得!!但是老鳥還是遍地飛呀...
哦哦...忘了說明錯(cuò)誤出現(xiàn)的場(chǎng)景了:組織---個(gè)人(多對(duì)多關(guān)系),更新組織中成員的時(shí)候出現(xiàn)了這個(gè)錯(cuò)誤,更新我用的update方法!!好吧下面說一下解決方案:只要把update換成merg就ok了!!
簡(jiǎn)單介紹一下merge方法:
merge方法
調(diào)用merge方法的時(shí)候,hibernate會(huì)檢查在持久化上下文中的持久化實(shí)例是否和脫管實(shí)例具有相同的標(biāo)識(shí)符。如果有,把脫管實(shí)例的狀態(tài)負(fù)責(zé)到持久化實(shí)例中;如果沒有,就從數(shù)據(jù)庫(kù)中加載,然后把脫管實(shí)例和獲取的對(duì)象狀態(tài)合并;如果數(shù)據(jù)庫(kù)中沒有查到結(jié)果,就創(chuàng)建新的持久化實(shí)例,把脫管實(shí)例的狀態(tài)復(fù)制到新實(shí)例,插入到數(shù)據(jù)庫(kù)中,并通過merge()操作返回。
我覺得我還有必要記錄一下我解決錯(cuò)誤時(shí)的方案:我首先想到的是hibernate懶加載惹的禍,因?yàn)槲以趆bm配置文件中配置了lazy懶加載。但是問題還是沒有解決。于是我把update(Team team, String tid)方法修改為update(Set<User> users, String tid),問題還是不得解決,于是完全否定了是懶加載的問題!但是對(duì)于上面的這種方案我還是不太理解,SSH的session問題肯定是一個(gè)大問題!!
未完待續(xù)......