SSH保存lob(blob,clob)数据

我们在应用ssh对blob数据进行存储时,会遇到一些细节的问题。这些涉及到了pojo中数据类型的定义,struts,hibernate中数据类型的定义,以及在spring配置文件中的定义等。从网上搜索,关于这些问题的总结如下:

一、问题需求:

 1.在持久化类中字段该用什么类型?

2.在Struts中文件对应的数据类型是什么?

3.在Hibernate中字段对应的类型是什么?

 4.如何在Spring中处理这些文件?

二、解决方法:

 1.在数据库中这些文件最终是以字节的形式存储二进制对象,所以在pojo类中将相应的属性定义为byte[]类型。

 2.在Struts中可以使用<html:file property="" />标签来上传文件,所以与之对应的ActionForm的属性类型为:

FormFile(org.apache.struts.upload.FormFile)类型,即使是使用了动态Form同理也是使用该类型.

提示:同时要将form标签修改为<html:formaction="/Action.do"method="post"enctype="multipart/form-data">(这是很关键的地方)

以支持文件上传后取得上传数据。在给持久对象赋值时只需调用(FormFile)form.get("property")).getFileData();

方法即可返回byte[]。

 3.在Hibernate中文件列对应的类型可以是org.springframework.orm.hibernate3.support.BlobByteArrayType,

org.springframework.orm.hibernate3.support.ClobStringType、clob、blob、binary。什么时候用BlobBYteArrayType

什么时候用ClobStringType?一般如果要处理的对象是数据库字段类型是blob时(主要是图片,二进制对象等),

映射文件设置为:org.springframework.orm.hibernate3.support.BlobByteArrayType数据库字段是clob(大文本对象)

类型时,要将java的属性的类型定为String,映射文件设置为: org.springframework.orm.hibernate3.support.ClobStringType。

 4.如果在spring上要使用Struts中自带的上传功能必须在spring的配置文件中加以声明.否者将会出现?

簀ava.lang.IllegalStateException:NoLobHandlerfoundforconfiguration-lobHandlerproperty

must be set on LocalSessionFactoryBean异常。配置如下:

 (1).声明一个处理句柄:

<beanid="lobHandler"class="org.springframework.jdbc.support.lob.DefaultLobHandler"lazy-init="true"/>

(2).在sessionFactory中注入lobHandler:

<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<propertyname="lobHandler"ref="lobHandler"/>

  </bean>

 提示: 指定lobHandler时,对于MySQL、DB2、MS SQL Server、Oracle 10g,使用DefaultLobHandler即可,而Oracle 9i,则可以使用OracleLobHandler。因为Oracle9i处理lob的方式和不太一样,所以这里要用spring提供的SimpleNativeJdbcExtractor.处理Oracle9i lob类型的特殊声明:

<bean id="nativeJdbcExtractor" lazy-init="true"  class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>

<bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.OracleLobHandler">

<propertyname="nativeJdbcExtractor">

<refbean="nativeJdbcExtractor"/>

</property>

</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<!--为处理Blob类型字段的句柄声明-->

<propertyname="lobHandler">

<reflocal="lobHandler"/>

</property>

</bean>(配置在spring的xml下sessionfactory配置下)

同时还应该使用对应的JDBC驱动。

Clob字段定义:<property name="属性名" column="列名" type="org.springframework.orm.hibernate.support.ClobStringType" length="1048"/>这里的length是指字节,最大可以到2G.该字段在java对象中声明为String类型。

     如果使用的是mysql数据库其默认的上传文件大小只有1047552字节:如果上传的文件大于1047552字节则会出现异常

org.springframework.jdbc.UncategorizedSQLException:Youcanchangethisvalueontheserverbysetting

themax_allowed_packet'variable.根据提示可以修改mysql数据库的max_allowed_packet属性大小。

打开my.ini文件中找到# SERVER SECTION后在port=3306下面加上max_allowed_packet=?M 修改完后重启mysql服务即可成功上传。

<html:form method="post" action="/Action.do" enctype="multipart/form-data"> </html:form>

相关推荐