星期三, 十二月 21, 2005

Hibernate,left join fetch,重复对象(记录)的问题

Hibernate 3.0中,mapping文件缺省配置的one-to-many的子集合是lazy declarations的,fetch的模式是join,当应用需要访问子表(1:M)中的数据时,hibernate框架会主动发起一条查询的sql。当我们需要在获取主记录的同时得到子记录的数据时,我们可以使用HSQL,“left join fetch”。但是当子记录存在时,主对象记录会有重复。

解决方法:http://forum.hibernate.org/viewtopic.php?t=938705&highlight=onetomany+query

fetch return distinct root instances

join has the same meaning as SQL join, so just use
Set results = new HashSet(query.list()) if you don't want duplicate results.


星期二, 十二月 13, 2005

FileUpload, session还是request

使用struts.upload模块处理文件上传的时候,会用到org.apache.commons.fileupload包。

如果包含文件上传的Action的scope="session",那么当前会话下,临时的上传文件始终有效,除非主动删除它。此时,重新启动Tomcat,在load org.apache.commons.fileupload.DefferredFileOutputStream时,系统会抛掷异常:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.apache.commons
.fileupload.DeferredFileOutputStream

常理来看,没必要创建会话级的上传文件的Formbean,因为太占内存了。但是Struts配置中,缺省的scope是session,所以要特别注意。


星期六, 十二月 10, 2005

java.lang.NoClassDefFoundError: javax/activation/DataSource

奇怪的异常。在创建一个MimeMessage对象的时候抛出的。

在项目的WEB-INF/lib中的确有activation.jar,但却总报这个错误。直到后来将activation.jar包拷贝到tomcat的common/lib下才算解决。不过解决的不明不白,郁闷。


星期五, 十二月 09, 2005

Tomcat环境下,字符编码的filter

在web.xml中,配置"Set Character Encoding" filter,可以实现客户端传入服务器端的Request对象中的数据的正确解码。

我使用的filter是Craig McClanahan写的,这位仁兄大名鼎鼎,他是Struts框架的主要体系设计师和开发者,Tomcat4的主设计师和Java Web Services Developer Pack实现包的主设计师,领导着Sun的JavaServer Faces规范开发,同时也是Java EE平台的Web Layer Archiecture。filter的代码附在文后。

web.xml中的配置如下:

<!-- GBK Encodinbg Filter definition -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>

<!-- GBK Encoding Filter mapping -->
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 查看全文

星期三, 十二月 07, 2005

Spring配置,属性,bean和local的区别

经常的<ref bean="aaa"/>或者<ref local="bbb"/>,这两者有什么区别?

看了http://www.springframework.org/dtd/spring-beans.dtd才明白,原来bean的类型是CDATA,local是IDREF,这表示,如果用local,那么,当前xml中必须存在id为"bbb"的bean声明,否则xml validator会报错的。

这也是local的本来含义,“本地”的bean。

如果<ref>指向的bean是在其它的配置中声明的,那么,必须用bean属性设置


星期四, 十二月 01, 2005

Spring+Hibernate,轻松处理Oracle clob字段

事实上,Spring 1.2.5版本的samples里的imagedb的例子,就是关于如何处理Oracle(同时也包括MySQL)的blob和clob字段的。

其实很简单,使用org.springframework.jdbc.support.lob.OracleLobHandler来处理Oracle中的clob/blob类型的字段。然后,pojo(持久化类)中对应clob字段的类型就是String,而hibernate hbm配置文件中的clob字段的type设置为org.springframework.orm.hibernate3.support.ClobStringType。

这样一来,以后就按照普通属性来处理这些大字段了,无需其它特别针对clob/blob的代码了。

 查看全文