• Struts+Spring+Hibernate处理Lob(Blob,Clob)


      在使用struts+spring+hibernate的开发中,有些时候用户会有数据库存储文件的需求,在数据库中一般会采用Blob字段或Clob字段来存储二进制图片、流媒体或文件。现就将在实际开发中遇到的问题及解决方法告之。 

     一、问题需求:

       1.在持久化类中字段该用什么类型?
       2.在Struts中文件对应的数据类型是什么?
       3.在Hibernate中字段对应的类型是什么?
       4.如何在Spring中处理这些文件?

     

     二、解决方法:

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

      2.在Struts中可以使用<html:file property="" />标签来上传文件,所以与之对应的ActionForm的属性类型为:FormFile(org.apache.struts.upload.FormFile)类型,即使是使用了动态Form同理也是使用该类型.
      提示:同时要将form标签修改为<html:form action="/Action.do" method="post" enctype="multipart/form-data"> ,以支持文件上传后取得上传数据。在给持久对象赋值时只需调用(FormFile) form.get("property")).getFileData();方法即可返回byte[]。

      3、在Hibernate中文件列对应的类型可以是:

      (1)org.springframework.orm.hibernate3.support.BlobByteArrayType

      (2)org.springframework.orm.hibernate3.support.ClobStringType

      (3)clob

      (4)blob

      (5)binary

      什么时候用BlobBYteArrayType?什么时候用ClobStringType?

      一般如果要处理的对象是数据库字段类型是blob时(主要是图片,二进制对象等),映射文件设置为:org.springframework.orm.hibernate3.support.BlobByteArrayType 数据库字段是clob(大文本对象)
    类型时,要将java的属性的类型定为String,映射文件设置为: org.springframework.orm.hibernate3.support.ClobStringType。

       4.如果在spring上要使用Struts中自带的上传功能必须在spring的配置文件中加以声明.否者将会出现 java.lang.IllegalStateException: No LobHandler found for configuration - lobHandler property
    must be set on LocalSessionFactoryBean异常。配置如下:

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

      

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

      (2)在sessionFactory中注入lobHandler: 

    1 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    2           <property name="lobHandler" ref="lobHandler"/>
    3   </bean>

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

     1 <bean id="nativeJdbcExtractor" lazy-init="true"  class="org.springframework.jdbc.support.nativejdbc.
     2 SimpleNativeJdbcExtractor"/>
     3 
     4 <bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.OracleLobHandler">
     5         <property name="nativeJdbcExtractor">
     6             <ref bean="nativeJdbcExtractor"/>
     7         </property>
     8 </bean> 
     9 
    10 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    11    
    12  <!-- 为处理Blob类型字段的句柄声明 -->
    13  <property name="lobHandler">
    14   <ref local="lobHandler" />
    15  </property>
    16 </bean>

      同时还应该使用对应的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: You can change this value on the server by setting the max_allowed_packet' variable.根据提示可以修改mysql数据库的max_allowed_packet属性大小。
      打开my.ini文件中找到# SERVER SECTION后在port=3306下面加上max_allowed_packet=?M 修改完后重启mysql服务即可成功上传。

  • 相关阅读:
    view和activity的区别
    接口对象的实例化在接口回调中的使用
    GreenDao
    HAOI 2012 高速公路
    SDOI2010 地精部落
    hdu 1505 City Game
    uva 1506 Largest Rectangle in a Histogram
    2017 济南综合班 Day 2
    uva 12325 Zombie's Treasure Chest
    uva 11212 Editing a Book
  • 原文地址:https://www.cnblogs.com/ao-xiang/p/5250805.html
Copyright © 2020-2023  润新知