spring hibernate 處理blob與clob類型

http://www.thinksaas.cn/group/topic/197458/

http://www.360doc.com/content/10/0917/10/3043847_54299063.shtml

在使用struts+spring+hibernate的開發中,有些時候用戶會有數據庫存儲文件的需求,在數據庫中一般會採用 Blob字段或Clob字段來存儲二進制圖片、流媒體或文件。現就將在實際開發中遇到的問題及解決方法告之。 一、問題需求: 1.在持久化類中字段該用什麼類型? 2.在Struts中文件對應的數據類型是什麼? 3.在Hibernate中字段對應的類型是什麼? 4.如何在Spring中處理這些文件? 5.下面有兩種解決方案,方案二比方案一更簡單. 二、解決方案一: 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中文件列對應的類型可以是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: No LobHandler found for configuration - lobHandler property must be set on LocalSessionFactoryBean異常。配置如下: (1).聲明一個處理句柄:     <bean id="lobHandler"class="org.springframework.jdbc.support.lob.DefaultLobHandler"lazy-init="true"/> (2).在sessionFactory中注入lobHandler:     <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">             <property name="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">           <property name="nativeJdbcExtractor">               <ref bean="nativeJdbcExtractor"/>           </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    <!-- 爲處理Blob類型字段的句柄聲明 --> <property name="lobHandler">     <ref local="lobHandler"/> </property> </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服務即可成功上傳。 解決方案二: 1.將驅動換爲ojdbc14.jar,如果使用class12.jar會出錯. 2.將數據庫中的字段設爲blob型,如代碼:  

create table photo
(
 photoId number primary key,
 photo blob not null,
);
3.將*.hbm.xml文件中的字段類型設爲java.sql.Blob型,如代碼:  
<property name="photo"type="java.sql.Blob">
 <column name="PHOTO"not-null="true"/>
</property>
4.將pojo中的屬性設爲java.sql.Blob型,如代碼:  
private Blob photo;
 public Blob getPhoto() {
 return this.photo;
}

 public void setPhoto(Blob photo) {
 this.photo = photo;
}
5.保存的時候:  
FileInputStream fis = new FileInputStream("c:\a.jpg");
photo.setPhoto(Hibernate.createBlob(fis));
photoService.save(photo);
保存操作完成.上面是對blob類型的操作,下面來看看對clob的操作: 1.同樣要使用ojdbc14.jar作爲驅動包. 2.將數據庫中的字段設爲clob型,如代碼:  
create table chaptercontent
(
 content clob not null,
);
3.將*.hbm.xml文件的字段類型設爲text型,如代碼:  
<property name="content"type="text">
 <column name="CONTENT"not-null="true"/>
</property>
5.將pojo上的屬性設爲String型,如代碼:  
private String content;
 public String getContent() {
 return this.content;
}

 public void setContent(String content) {
 this.content = content;
}
經過這些操作之後,我們就可以將clob型的字段當作String型來操作了. 如保存時:    
pojoObj.setContent("保存的值");
dao.save(pojoObj);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章