`
jervis
  • 浏览: 22760 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

关于Oracle的 Clob数据类型在Hibernate中的应用小结

阅读更多

关于Oracle Clob数据类型

Hibernate中的应用小结

 

 

 

 

 

作者: <rtx w:st="on">陈智峰</rtx>   日期: <chsdate w:st="on" year="2004" month="12" day="9" islunardate="False" isrocdate="False">2004-12-9</chsdate>

Email:czf825@126.com  QQ:21843781

MSN: czf825@hotmail.com

 

欢迎交流!!

1.    文档背景介绍

文档主要以本人在一个类似日志系统的项目中对“会议记要”模块进行修改时所遇到的问题为背景,描述了Oracle Clob数据类型在Hibernate中的应用心得。现把心得小结一下,跟大家一块交流学习,本文的有关代码均已调试通过。

下面是“会议记要”模块的基本信息(其它与本文主题无关的信息均已省略):

名称

图表

说明

实体(MeetingHead)

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 174.75pt; HEIGHT: 88.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image001.emz"></imagedata></shape>

1、  summaryClob”属性是记录会议内容,类型为Clob

2、  summaryClobString”属性是String类型的辅助字段,其作用是配合“summaryClob”属性的读取,此属性不映射到数据库中。

实体Form

(MeetingHeadForm)

<shape id="_x0000_i1026" style="WIDTH: 174.75pt; HEIGHT: 75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image003.emz"></imagedata></shape>

1、   summaryClobString”是与MeetingHead实体相对应的属性。

数据库表结构

(Meeting_Head)

<shape id="_x0000_i1027" style="WIDTH: 162pt; HEIGHT: 126.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image005.emz"></imagedata></shape>

1、“summaryClob”是Clob类型的字段。

 

 

 

 

2.    问题的出现

summaryClob--------是“会议记要”中的“会议内容”字段,这个字段是记录会议内容的主要地方,原来设计时定为VARCHAR2类型,最大长度为4000 bytes,即可以支持两千汉字以内的长度,而我们在实际的应用中,会议内容往往会超过两千汉字,从而导致超出的部分不能写入数据库中,因此我们有必要改为大字段类型。

3.    改进方案

通常,要解决超过4000字节的数据,一种做法是将数据写入文件,xmlplain file都可以,数据表中保存文件的路径即可。这种做法不必处理clob(Character Large Object), blob(Binary Large Object)等格式的字段类型,但不易做transaction的控制,而且增加了对文件的处理操作,不算是较佳的一个方案。另一个做法是使用clob, blob等字段类型,主要有:采用传统的jbdc方式、把clobstring方式处理、直接使用clob类型三种方案,下面分别作简要介绍 [1]

3.1               传统的jbdc方式

写入Blob/Clob字段和写入其它类型字段的方式非常不同,因为Blob/Clob自身有一个cursor,必须使用cursorBlob/Clob进行操作,因而在写入Blob/Clob之前,必须获得cursor才能进行写入,那就需要先插入一个emptyBlob/Clob,这将创建一个Blob/Clobcursor,然后再把这个emptyBlob/Clobcursorselect查询出来,这样通过两步操作,就获得了Blob/Clobcursor,可以真正的写入Blob/Clob数据了。这种方式比较麻烦,读写都要增加不少工作量 [2]

关于这种方式的具体实现代码,在Hibernate的中国网站中,其站长robbin已详细描述过,具体请参照:http://forum.iteye.com/viewtopic.php?t=254

3.2               clobstring方式处理

此方法主要是通过继承net.sf.hibernate.type.ImmutableType类或cirrus.hibernate.UserType类来创建一个新的类如:StringClobType,然后在相应的配置文件里面,把该字段映射为StringClobType类型,即可正常操作。此方法的优点主要体现在具体实现操作的代码较为简单,但在第一步的映射问题上,较难理解。

有关此方法的具体实现代码请参照:http://www.hibernate.org/76.html

3.3               直接使用clob类型

第三种方法是直接使用clob类型,它主要是在实体中增加一个clobString字段,通过对该字段的读写,在DAOImpl层进行特殊处理后,转换为真正的clob类型,从而实现clob类型字段的CRUD操作,其大致的处理流程如下图所示:

 

<shape id="_x0000_i1028" style="WIDTH: 390.75pt; HEIGHT: 235.5pt" type="#_x0000_t75" o:ole=""><imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image007.emz"></imagedata></shape>

此方法主要优点体现在配置文件的映射类型上,只需要像映射其它基本类型一样,直接写上 type="clob" 就OK了。这对初次遇到这种问题的人来说入门相对容易。由于第二种方法需要额外地创建一个新类型,而且对ImmutableTypeUserType类不太了解,因此我推荐采用第三种方法。

关于此方法的官方文档请参照:Using Clobs with Oracle and Hibernate 1.2

 

下面,我将按照本部门约定的标准开发架构,结合tmsht项目的“会议记要”模块,从实体类到DAOImpl实现类,分别详细地描述clob类型的配置及其CRUD操作的具体实现代码。

4.    实现过程

本章节主要分为“基本配置”及“CRUD的实现”两小节。第一小节分别从实体类、实体类对应的Form类以及hibernate映射文件三个方面描述了clob类型的配置步骤;第二小节则描述了CRUD操作的具体实现代码,由于主要的实现代码在DAOImpl层出现,因此Delegate、Service 、ServiceImpl 、DAO四层的代码将省略。

注意:1、所有实际代码均在黑方框内,并带有灰色底纹。

      2、与本文档主题无关的代码统一用 ”…………” 表示。

4.1        基本配置

4.1.1    实体类

在该字段对应的实体文件里面,增加以下两个变量及其相应的get/set方法。注意:summaryClobString并不映射到数据库的CLOB字段,只是方便需要使用这个BO的人用get / set 处理CLOB字段。

…………

 

private Clob summaryClob;

private String summaryClobString;

 

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;

}

 

…………

 

4.1.2    实体Form

在该实体对应的Form里添加一个字符串变量及相应的

分享到:
评论

相关推荐

    关于Clob类型在Hibernate中 的应用小结

    在实际应用中,处理Clob数据时需要注意内存管理和性能优化,尤其是当数据量非常大时。避免一次性加载整个Clob内容到内存,可以使用流式处理或者分段读取的方式来减少内存消耗。此外,还要注意数据库的性能,比如使用...

    Hibernate操作Oarcle中Clob、Blob字段小结

    这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...

    Spring中文帮助文档

    在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...

    Spring API

    在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...

Global site tag (gtag.js) - Google Analytics