我们一般对于大批的字符数据处理都采用CLOB字段,而不同的数据库对CLOB字段的处理,都有所不同。诸如MySQL和SQLServer与普通的String是一样的,而ORACL则会因为版本的不同而不同,对于Oracle9i的补丁版以上,可以当作普通的String处理(使用的驱动必须是ORAcle10g或以上)。但是对于Oracle9i(非补丁版)则需要特别处理。
对于普通的类型,我们这里不作阐述,而对于普通的JDBC的处理方式,思路很简单,在新增的时候,将此字段插入一个empty,让后做更新操作,操作方式为流的形式。而对于使用Hibernate作为数据访问层的项目来说,那么这个处理就相对而言麻烦点,以下分2种情况进行讨论。
1、纯Hibernate处理型
首先,我们设定我们的处理方式是,在实体类中增加一个String属性,对应Clob属性的String结果。这个属性不对应数据的任何Mapping.诸如:
<property name="content" type="java.sql.Clob" update="true" insert="true" column="CONTENT" />此处对应数据库中的字段
实体类属性:
public class News {
private Clob content;
private String contentString ;
...
}
其处理代码段:
Session session = getSession();
entity.setContent(Hibernate.createClob(" "));
//如果是新增数据:
session.save(entity);
//如果是更新数据:
session.update(entity);
//共同片断
session.flush();
session.refresh(entity, LockMode.UPGRADE);
java.io.Writer pw = ((oracle.sql.CLOB) ((org.hibernate.lob.SerializableClob) entity.getContent())
.getWrappedClob()).getCharacterOutputStream();
pw.write(entity.getContentString());
pw.flush();
pw.close();
releaseSession(sessio;
2、Spring Integrate with Hibernate
如果是使用了Spring的话,那么我们可以考虑以一种更简单的方式来处理,由Spring代理来处理Clob,但是程序依然像普通String一样对待,这样一来,处理起来与普通String就没有任何区别。那么我们要做的就只有余下一点
首先在Spring的配置文件中加入Spring对Clob的处理类:
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" lazy-init="true" />
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
...
<property name="lobHandler">
<ref local="oracleLobHandler" />
</property>
</bean>
这样,Spring对Clob的Handler就加入了。现在尚缺明确对什么处理了。那么我们需要改变Clob对应的hibernate类型
<property name="content" type="org.springframework.orm.hibernate3.support.ClobStringType" update="true" insert="true" column="CONTENT" />
对应的实体类:
public class News {
private String content;
...
}
一切就这么简单,让我们忘掉Clob吧。以上各类是在Spring 2.0和Hibernate3.0的配置,如果是其他版本请查找对应的类
对于普通的类型,我们这里不作阐述,而对于普通的JDBC的处理方式,思路很简单,在新增的时候,将此字段插入一个empty,让后做更新操作,操作方式为流的形式。而对于使用Hibernate作为数据访问层的项目来说,那么这个处理就相对而言麻烦点,以下分2种情况进行讨论。
1、纯Hibernate处理型
首先,我们设定我们的处理方式是,在实体类中增加一个String属性,对应Clob属性的String结果。这个属性不对应数据的任何Mapping.诸如:
<property name="content" type="java.sql.Clob" update="true" insert="true" column="CONTENT" />此处对应数据库中的字段
实体类属性:
public class News {
private Clob content;
private String contentString ;
...
}
其处理代码段:
Session session = getSession();
entity.setContent(Hibernate.createClob(" "));
//如果是新增数据:
session.save(entity);
//如果是更新数据:
session.update(entity);
//共同片断
session.flush();
session.refresh(entity, LockMode.UPGRADE);
java.io.Writer pw = ((oracle.sql.CLOB) ((org.hibernate.lob.SerializableClob) entity.getContent())
.getWrappedClob()).getCharacterOutputStream();
pw.write(entity.getContentString());
pw.flush();
pw.close();
releaseSession(sessio;
2、Spring Integrate with Hibernate
如果是使用了Spring的话,那么我们可以考虑以一种更简单的方式来处理,由Spring代理来处理Clob,但是程序依然像普通String一样对待,这样一来,处理起来与普通String就没有任何区别。那么我们要做的就只有余下一点
首先在Spring的配置文件中加入Spring对Clob的处理类:
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" lazy-init="true" />
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
...
<property name="lobHandler">
<ref local="oracleLobHandler" />
</property>
</bean>
这样,Spring对Clob的Handler就加入了。现在尚缺明确对什么处理了。那么我们需要改变Clob对应的hibernate类型
<property name="content" type="org.springframework.orm.hibernate3.support.ClobStringType" update="true" insert="true" column="CONTENT" />
对应的实体类:
public class News {
private String content;
...
}
一切就这么简单,让我们忘掉Clob吧。以上各类是在Spring 2.0和Hibernate3.0的配置,如果是其他版本请查找对应的类