




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、-. z.- - - z - 關于Oracle的 Clob數據類型在Hibernate中的應用小結 智峰 日期:2004-12-9Email:czf825126.QQ:21843781MSN: czf825hotmail.歡送交流!目 錄TOC o 1-3 h z uHYPERLINK l _Toc904317891.文檔背景介紹 PAGEREF _Toc90431789 h 3HYPERLINK l _Toc904317902.問題的出現 PAGEREF _Toc90431790 h 4HYPERLINK l _Toc904317913.改良方案 PAGEREF _Toc90431791 h
2、 4HYPERLINK l _Toc904317923.1傳統的dc方式 PAGEREF _Toc90431792 h 4HYPERLINK l _Toc904317933.2把clob以string方式處理 PAGEREF _Toc90431793 h 4HYPERLINK l _Toc904317943.3直接使用clob類型 PAGEREF _Toc90431794 h 5HYPERLINK l _Toc904317954.實現過程 PAGEREF _Toc90431795 h 6HYPERLINK l _Toc904317964.1根本配置 PAGEREF _Toc90431796 h
3、 6HYPERLINK l _Toc90431797實體類 PAGEREF _Toc90431797 h 6HYPERLINK l _Toc90431798實體Form PAGEREF _Toc90431798 h 7HYPERLINK l _Toc90431799映射文件 PAGEREF _Toc90431799 h 7HYPERLINK l _Toc904318004.2CRUD的實現 PAGEREF _Toc90431800 h 7HYPERLINK l _Toc90431801創立(Create) PAGEREF _Toc90431801 h 7HYPERLINK l _Toc9043
4、1802更新(Update) PAGEREF _Toc90431802 h 8HYPERLINK l _Toc90431803讀取(Read) PAGEREF _Toc90431803 h 9HYPERLINK l _Toc90431804刪除(Delete) PAGEREF _Toc90431804 h 10HYPERLINK l _Toc904318055.參考文獻 PAGEREF _Toc90431805 h 10HYPERLINK l _Toc90431806附錄 PAGEREF _Toc90431806 h 11文檔背景介紹文檔主要以本人在一個類似日志系統的工程中對會議記要模塊進展修
5、改時所遇到的問題為背景,描述了Oracle 的Clob數據類型在Hibernate中的應用心得。現把心得小結一下,跟大家一塊交流學習,本文的有關代碼均已調試通過。下面是會議記要模塊的根本信息其它與本文主題無關的信息均已省略:名稱圖表說明實體(MeetingHead)summaryClob屬性是記錄會議容,類型為Clob。summaryClobString屬性是String類型的輔助字段,其作用是配合summaryClob屬性的讀取,此屬性不映射到數據庫中。實體Form(MeetingHeadForm)summaryClobString是與MeetingHead實體相對應的屬性。數據庫表構造(M
6、eeting_Head)1、summaryClob是Clob類型的字段。問題的出現summaryClob是會議記要中的會議容字段,這個字段是記錄會議容的主要地方,原來設計時定為VARCHAR2類型,最大長度為4000 bytes,即可以支持兩千漢字以的長度,而我們在實際的應用中,會議容往往會超過兩千漢字,從而導致超出的局部不能寫入數據庫中,因此我們有必要改為大字段類型。改良方案通常,要解決超過4000字節的數據,一種做法是將數據寫入文件,*ml或plain file都可以,數據表中保存文件的路徑即可。這種做法不必處理clob(Character Large Object), blob(Bina
7、ry Large Object)等格式的字段類型,但不易做transaction的控制,而且增加了對文件的處理操作,不算是較佳的一個方案。另一個做法是使用clob, blob等字段類型,主要有:采用傳統的dc方式、把clob以string方式處理、直接使用clob類型三種方案,下面分別作簡要介紹eq oac(,1)。傳統的dc方式寫入Blob/Clob字段和寫入其它類型字段的方式非常不同,因為Blob/Clob自身有一個cursor,必須使用cursor對Blob/Clob進展操作,因而在寫入Blob/Clob之前,必須獲得cursor才能進展寫入,那就需要先插入一個empty的Blob/Cl
8、ob,這將創立一個Blob/Clob的cursor,然后再把這個empty的Blob/Clob的cursor用select查詢出來,這樣通過兩步操作,就獲得了Blob/Clob的cursor,可以真正的寫入Blob/Clob數據了。這種方式比擬麻煩,讀寫都要增加不少工作量eq oac(,2)。關于這種方式的具體實現代碼,在Hibernate的中國中,其站長robbin已詳細描述過,具體請參照:forum.javaeye./viewtopic.phpt=254把clob以string方式處理此方法主要是通過繼承類或類來創立一個新的類如:StringClobType,然后在相應的配置文件里面,把該
9、字段映射為StringClobType類型,即可正常操作。此方法的優點主要表達在具體實現操作的代碼較為簡單,但在第一步的映射問題上,較難理解。有關此方法的具體實現代碼請參照:./76.html直接使用clob類型第三種方法是直接使用clob類型,它主要是在實體中增加一個clobString字段,通過對該字段的讀寫,在DAOImpl層進展特殊處理后,轉換為真正的clob類型,從而實現clob類型字段的CRUD操作,其大致的處理流程如下列圖所示:此方法主要優點表達在配置文件的映射類型上,只需要像映射其它根本類型一樣,直接寫上 type=clob就OK了。這對初次遇到這種問
10、題的人來說入門相對容易。由于第二種方法需要額外地創立一個新類型,而且對ImmutableType和UserType類不太了解,因此我推薦采用第三種方法。關于此方法的官方文檔請參照:Using Clobs with Oracle and Hibernate 1.2下面,我將按照本部門約定的標準開發架構,結合tmsht工程的會議記要模塊,從實體類到DAOImpl實現類,分別詳細地描述clob類型的配置及其CRUD操作的具體實現代碼。實現過程本章節主要分為根本配置及CRUD的實現兩小節。第一小節分別從實體類、實體類對應的Form類以及hibernate映射文件三個方面描述了clob類型的配置步驟;第
11、二小節則描述了CRUD操作的具體實現代碼,由于主要的實現代碼在DAOImpl層出現,因此Delegate、Service 、ServiceImpl 、DAO四層的代碼將省略。注意:1、所有實際代碼均在黑方框,并帶有灰色底紋。 2、與本文檔主題無關的代碼統一用 表示。根本配置實體類在該字段對應的實體文件里面,增加以下兩個變量及其相應的get/set方法。注意:summaryClobString并不映射到數據庫的CLOB字段,只是方便需要使用這個BO的人用get / set 處理CLOB字段。private Clob summaryClob;private String summaryClobSt
12、ring;public Clob getSummaryClob() return summaryClob;public void setSummaryClob(Clob summaryClob) this.summaryClob = summaryClob;public String getSummaryClobString() return summaryClobString;public void setSummaryClobString(String summaryClobString) this.summaryClobString = summaryClobString;實體Form在
13、該實體對應的Form里添加一個字符串變量及相應的get/ser方法:private String summaryClobString;public String getSummaryClobString() return summaryClobString;public void setSummaryClobString(String summaryClobString) this.summaryClobString = summaryClobString;注意:在Form里面只需要用summaryClobString與實體類進展對應就可以了,這樣,在下面的Delegate層里,就可以不用作其
14、它特殊處理,直接用monUtil.copyProperties()方法對實體和Form進展轉換。hibernate映射文件在該實體對應的映射文件里只需要增加下面一行,直接聲明該字段為clob類型:CRUD的實現創立(Create)public class MeetingHeadDAOHibernate e*tends BaseDAOHibernate implements MeetingHeadDAO /* * author CZF * Description:創立一個新的會議記要 */ public Serializable createMeetingHead(MeetingHead mh)
15、 throws DAOE*ception try Session sess = HibernateHelper.currentTransaction(); Serializable result = sess.save(mh); sess.flush();/初始化SummaryClob字段lob();mh.setSummaryClob(clob);/*也可采用此方法進展初始化 mh.setSummaryClob (Hibernate.createClob(); */ /此處一定要用lockMode.UPGRADE模式進展鎖定刷新sess.refresh(mh, LockMode.UPGRADE
16、);/獲取MeetingHead實體的SummaryClobString屬性值 String content = mh.getSummaryClobString();/將獲取的輔助字段的值通過的putString方法賦值給實體的summaryClob字段 oracle.sql.CLOB clob = (oracle.sql.CLOB) mh.getSummaryClob(); clob.putString(1, content); HbernateHelper.endCurrentTransaction(); return result;更新(Update)更新原理跟創立類似,但記住在更新前一
17、定要先將原實體的clob類型的字段容清空,然后再賦新值進去,否則會出現不能刪除舊容的情況。public class MeetingHeadDAOHibernate e*tends BaseDAOHibernate implements MeetingHeadDAO /* * author CZF * Description:更新一個新的會議記要 */public void updateMeetingHead(MeetingHead mh) throws DAOE*ception Class clazz = this.getEntityClass(); try Session sess = Hi
18、bernateHelper.currentTransaction();/ 首先通過鎖模式把該實體讀出來MeetingHead oldMh = (MeetingHead) sess.load(clazz, mh.getId(), LockMode.UPGRADE);/ 獲取輔助字段的值 String newMhValue = mh.getSummaryClobString();/ 更新前首先要清空原clob字段的容 oracle.sql.CLOB clob_empty = oracle.sql.CLOB.empty_lob(); oldMh.setSummaryClob(clob_empty);
19、/ 必須要執行以下兩步,否則將拋出不能對空clob進展讀寫操作的異常 sess.flush(); sess.refresh(oldMh, LockMode.UPGRADE);/將獲取的輔助字段的值通過的putString方法賦值給實體的summaryClob字段 oracle.sql.CLOB clob = (oracle.sql.CLOB) oldMh.getSummaryClob(); clob.putString(1, newMhValue);讀取(Read)public class MeetingHeadDAOHibernate e*tends BaseDAOHibernate imp
20、lements MeetingHeadDAO /* * author CZF * Description:讀取一個會議記要* /public MeetingHead getMeetingHeadById(String id) throws BusinessE*ception, SQLE*ception MeetingHead mh = (MeetingHead) service.getMeetingHeadById(id); /獲取實體的Clob字段的值 java.sql.Clob clob = mh.getSummaryClob(); /將獲取的Clob值通過java.sql.Clob的getSubString()方法賦值給實體的 輔助字段 if (clob != null) String b1 = clob.getSubString(1, (int) clob.length(); mh.setSummaryClobString(b1); return mh; 刪除(Dele
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 院感培訓第一季度
- 2025年自動售貨機項目提案報告
- 海康java面試題及答案
- 快餐服務員考試題及答案
- 新時代主題教育實施路徑
- 餐飲領班考試題及答案
- 野狗智力測試題及答案
- 工業互聯網平臺SDN在智能工廠生產調度與優化中的應用報告
- 培訓簡報格式模板
- 超市衛生法律法規
- 國開《學前兒童語言教育活動指導》形考1-4試題及答案
- 海康2023綜合安防工程師認證試題答案HCA
- 濁度儀使用說明書
- GB/T 14404-2011剪板機精度
- GB/T 14294-1993組合式空調機組
- GA 1517-2018金銀珠寶營業場所安全防范要求
- 提高痰留取成功率PDCA課件
- 組合導航與融合導航解析課件
- 伊金霍洛旗事業編招聘考試《行測》歷年真題匯總及答案解析精選V
- 深基坑支護工程驗收表
- 顱腦CT影像課件
評論
0/150
提交評論