星期三, 十二月 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的代码了。
查看全文