Spring+Hibernate问题记录

1.BLOB查询时遇到异常:
testSaveOrUpdateOrList(net.kofsky.nmis.po.TestPO.TestMerchandisePO)
org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.GenericJDBCException:
could not initialize a collection: [net.kofsky.nmis.po.Merchandise.merImage#11]
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Unsupported data conversion.
网上查阅得知微软提供的JDBC驱动bug甚多,并且不支持BLOB的部分操作

解决方案:将MS驱动换为:jtds-1.2.1.jar,重新配置数据源,Ok

2.Spring+Hibernate分页查询
  List tempList = hibernateTemplate.executeFind(new HibernateCallback() {
   public Object doInHibernate(Session session) {
    Query query = session.createQuery(hql);
    query.setFirstResult(start);
    query.setMaxResults(pageSize);
    List list = query.list();
    return list;
   }
  });

3.聚合查询问题
比如查询某个表单的所有记录,直接用SQL或者HQL都很简单,但用Spring+Hibernate却又麻烦一些
方法一:采用spring的回调方式
    final String tempHql = "select count(*) from " + PO;
    List record = hibernateTemplate
    .executeFind(new HibernateCallback() {
     public Object doInHibernate(Session session) {
      Query query = session.createQuery(tempHql);
      List list = query.list();
      return list;
     }
    });
    int recordCount=((Long)record.get(0)).intValue();//获取数值
方法二:

    String tempHql = "select count(*) from " + PO;
    int recordCount=((Long)hibernateTemplate.find(tempHql).iterator().next()).intValue();

4.Spring异常处理

  做了了三个简单的测试页面: 登录页面login.jsp, 登录成功页面index.jsp,失败页面error.jsp,配置一个登录控制器;调试过程中,一直由页面login.jsp跳入error.jsp,一直如此,没有任何异常和错误提示,用System.out.print跟踪到数据库操作代码的中间,然后中止了,不返回任何数据。找了半天错误,原来发现配置了Spring的异常处理:

<bean id="exceptionResolver"
  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="defaultErrorView">
   <value>error</value>
  </property>
  <property name="exceptionMappings">
  <props>
   <prop key="java.sql.SQLException">error</prop>
   <prop key="java.lang.RuntimeException">error</prop>
  </props>
  </property>
 </bean>

  在后台处理过程发生异常后,直接跳入了配置的error.jsp页面,因此不会输出任何异常。在调试时需要把这段去掉,跟踪可能出现的问题,待发布时再加入异常处理页面。

   这个问题也说明了单元测试的重要性,如果后台的操作全部经过了比较详尽的单元测试,那么出现这类问题的可能性就很小了。~~

5.插播一个:C++的临时指针问题

 FeatureGroup<featureType,resultType>* temp;//临时指针,用于遍历向量内数据
 for ( ; sIter != eIter; sIter++ )
 {    //operation based temp
 }

  循环内操作完毕以后,对临时指针不作任何处理。一般来讲是没啥问题了,只是用了一个临时空间而已,也没有delete操作,不会影响到原始向量空间内的数据。

  但事实并非如此,C++自动会将临时指针所指向的对象销毁,这样问题就出现了,当用了这段循环遍历的代码以后,发现最后向量的最后一个数据出现了混乱,完全不合常理。

  解决方案有三个:不用临时指针、将临时指针设置为全局变量、临时指针用完以后设置为NULL

  杨世泉说最后一个可能有问题,但我做ISODATA时大量采用了这种方式,似乎没有问题~~


 6.中文问题

  依稀记得,刚开始用java作网页的时候,被其中的编码问题弄的心力交瘁。在做页面之前,我似乎已经完全忘掉了这个问题。今天,又一次被这个问题难住了。

   完全让人头晕的东西,页面编码格式,内存中编码格式,传输编码格式,浏览器解码格式,数据库编码格式,数据库链接编码。。。。

   为了简单,我把所有涉及编码的地方都设置为gb2312,可惜,在页面提交后,到了web服务器端就出现了问题,变成乱码了。在服务器端,通过如下方法获得正常输出:

    new String(s.getBytes("8859_1"), "gb2312");(网络流中一般采用8859_1传输)

    可是不想每个参数都加入这么一句转换。网上查到两种解决方式:

   a 在web.xml中配置Spring的编码

  <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>
   org.springframework.web.filter.CharacterEncodingFilter
  </filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>gb2312</param-value>
  </init-param>
 </filter>

   b.在server.xml中<Connector  port="8080"...>属性中加入URIEncoding="gb2312"

  两种方法完全不起作用。很奇怪。将所有编码全部设成utf8,也是如此。只不过,在服务器端需要通过 new String(s.getBytes("8859_1"), "utf8")才能获得正常的参数了。

  郁闷,莫非真的要每个数据要要手工转换一下?!啊

  补记:解决了,web.xml加CharacterEncodingFilter时忘了加:

   <filter-mapping>
      <filter-name>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>

  加上就可以了。

7.极品问题:找不到某些文件

  jsp文件明明存在,访问服务器却显示文件不存在....用javascript读本地图像文件,文件明明在目录下面,硬是没办法加载....显出出来是一个一个的红叉叉.....这个问题俺被困扰多时,今天被一高人解决....晕惨啊.....

  原因:缓存问题....Eclipse没有编译部分文件,致使tomcat无法找到文件

  在工作目录下面,用工程项目的名称搜索,可以在eclipse的缓存中看到其自动编译的文件,会发现,凡是tomcat找不到的文件,这里都没有... 

  老夫的相对目录是..workplace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/NMisSystem/org/apache/jsp/等..(在工作目录的.metadata文件夹下搜一下就可以了,有多个)

  删之.....让eclipse rebuild项目.....

 8.Hibernate保存数据时错误:java.lang.ClassCastException: java.sql.Timestamp
/**
* @hibernate.property column="registerTime" type="java.sql.Date" length="50"
*/
错误原因:生成映射文件的注释里面,多了个length="50",呵呵,这是只有字符串才有的参数,如果字段是Date,是不应该有的

9.数据更新的时候一定要加上隐藏字段(JSTL作页面):
<spring:bind path="command.id">
<input type="hidden" value="<c:out value="${status.value}"/>" name="<c:out value="${status.expression}"/>">
</spring:bind>
怎么老是忘了呢?!!

10.Command(就是与页面绑定的类,strtus里叫Form) 里面 字段必须小写字母打头,否则抛出:org.springframework.beans.NotReadablePropertyException: Invalid property 'EndIP' of bean class [net.kofsky.nmis.command.NetBarCommand]: Bean property 'EndIP' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

 11、log4j的配置

  在非web应用环境下,只需要把log4j的包放到classpath下,然后在程序中加入private Logger log = Logger.getLogger(XXXClass.class);,然后就可以直接用log进行日志记录了~~

用Spring进行web开发,还需要在web.xml中配置
   <context-param>    
      <param-name>webAppRootKey</param-name>     
     <param-value>NMisSystem.root</param-value>
   </context-param>
 
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>
 
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

log4j比较详细的介绍可以看:http://goodluckyemin.bokee.com/2669924.html

12、在Eclipse可以运行,但在tomcat中发布项目时出现错误:org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@1589d3d for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category) (Caused by org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@1589d3d for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category))
俺的log4j包一直都放在lib下面,怎么可能找不到呢?很奇怪~~后来上网查了一下,发现包放重复了有可能出现这种错误~~一直找,在jre/lib/ext下面很多包,很多都和WEB-INF/lib下的包重复了,汗,除dnsns.jar四个原有的包外,其他全部删除,重启tomcat,ok

13、tomcat中发布项目:
a.Eclipse中导出项目为.war(或者ant打包)
b.将war文件拷贝到%TOMCAT_HOME%/webapps/下
(直接放到webapp下似乎不需要设置虚拟目录)
c.启动tomcat。。。。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值