迷失北京

BlogJava 联系 聚合 管理
  60 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks

    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不能分清楚用户谁是创建者谁是用户,所以出现了这样的问题。干脆抛弃双向的关系,双方都使用单向的关系,问题解决了!!

       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问题肯定是一个大问题!!

未完待续......

    

posted on 2011-03-19 19:36 王康 阅读(1411) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: