读书人

关于Oracle的Clob数据类型在Hibernate

发布时间: 2012-09-07 10:38:15 作者: rapoo

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

使用Clob数据大体上有三种方法:采用传统的jbdc方式、把clob以string方式处理、直接使用clob类型三种方案

传统的jbdc方式
写入Blob/Clob字段和写入其它类型字段的方式非常不同,因为Blob/Clob自身有一个cursor,必须使用cursor对Blob/Clob进行操作,因而在写入Blob/Clob之前,必须获得cursor才能进行写入,那就需要先插入一个empty的Blob/Clob,这将创建一个Blob/Clob的cursor,然后再把这个empty的Blob/Clob的cursor用select查询出来,这样通过两步操作,就获得了Blob/Clob的cursor,可以真正的写入Blob/Clob数据了。这种方式比较麻烦,读写都要增加不少工作量。
把clob以string方式处理
此方法主要是通过继承net.sf.hibernate.type.ImmutableType类或cirrus.hibernate.UserType类来创建一个新的类如:StringClobType,然后在相应的配置文件里面,把该字段映射为StringClobType类型,即可正常操作。此方法的优点主要体现在具体实现操作的代码较为简单,但在第一步的映射问题上,较难理解。
直接使用clob类型
第三种方法是直接使用clob类型,它主要是在实体中增加一个clobString字段,通过对该字段的读写,在DAOImpl层进行特殊处理后,转换为真正的clob类型,从而实现clob类型字段的CRUD操作
此方法主要优点体现在配置文件的映射类型上,只需要像映射其它基本类型一样,直接写上 type="clob" 就OK了。这对初次遇到这种问题的人来说入门相对容易。由于第二种方法需要额外地创建一个新类型,而且对ImmutableType和UserType类不太了解,因此我推荐采用第三种方法。

具体例子:

package test.test;

import java.sql.SQLException;
import java.util.List;

import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
import test.bean.Testlob;

public class test {

?public static void main(String[] args) {

??Configuration config = null;
??SessionFactory factory = null;
??Session session = null;

??try {
???config = new Configuration().configure();
???factory = config.buildSessionFactory();
???session = factory.openSession();
???Transaction tx = session.beginTransaction();
???Testlob test = new Testlob();
???//增加
???test.setId(new Integer(2));
???test.setLog(transStr2Clob("测试增加数据"));
???session.save(test);

???//修改
???test = (Testlob) session.get(Testlob.class, new Integer(1));
???test.setLog(transStr2Clob("测试修改数据"));
???session.update(test);
???
???
???//查询
???test = (Testlob) session.get(Testlob.class, new Integer(1));
???System.out.println(transClob2Str(testLob.getLog()));
???}
???
???//复杂查询
???String sql="from Testlob as test where DBMS_LOB.INSTR(test.log,'我',1,1)>0";
???List list = session.find(sql);
???for (int i=0,j=list.size();i<j;i++) {
????Testlob testLob=(Testlob)list.get(i);
????System.out.println(transClob2Str(testLob.getLog()));
???}
???tx.commit();

??} catch (HibernateException e) {
???e.printStackTrace();
??} catch (Exception e) {
???e.printStackTrace();
??} finally {

???try {
????if (session != null)
?????session.close();
????if (factory != null)
?????factory.close();
???} catch (HibernateException e) {
????e.printStackTrace();
???}
??}

?}
?
?public static String transClob2Str(java.sql.Clob clob) {
??if (clob == null)
???return null;
??String str = "";
??try {
???str = clob.getSubString(1, (int) clob.length());
??} catch (SQLException e) {
???e.printStackTrace();
??}
??return str;

?}

?public static java.sql.Clob transStr2Clob(String str) {
??return Hibernate.createClob(str);
?}

}

读书人网 >软件架构设计

热点推荐