`
riss
  • 浏览: 14945 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Re: Hibernate:使用用户定义的类型转换CLOB到String(setCharacte...

阅读更多
终于可以发贴了,在http://www.matrix.org.cn/thread.shtml?topicId=32938&forumId=23上给出问题,竞没人回话,先说问题吧!
我在自己定义的用户类型中遇到下面的问题:
下面这个函数读出数据没有问题:
public Object nullSafeGet(ResultSet resultSet, String[] stringArray,
Object object) throws HibernateException,
SQLException {
Reader reader = resultSet.getCharacterStream(stringArray[0]);
if (reader == null) return null;

StringBuffer sb = new StringBuffer();
try {
char[] charbuf = new char[4096];
//解决4096字节大小的限制
for (int i = reader.read(charbuf); i >0; i= reader.read(charbuf)) {
sb.append(charbuf, 0, i);
}
}
catch (IOException e) {
throw new SQLException( e.getMessage() );
}
return sb.toString();
}
//下面的函数写入数据总是不正确
public void nullSafeSet(PreparedStatement preparedStatement, Object object,
int _int) throws HibernateException, SQLException {
try{
if (object != null) {
// StringReader r = new StringReader( (String) object);
//下面的方法写入太多的数据会使CLOB为空,几百个字节没有问题
/* preparedStatement.setCharacterStream(_int, r,
( (String) object).length());*/

preparedStatement.setCharacterStream(_int,
new InputStreamReader(new ByteArrayInputStream(((String) object).getBytes())),
( (String) object).length());
System.out.println( (String) object+((String) object).length());
//下面的方法写入数据的长度有限制
// preparedStatement.setString(_int,(String) object);
} else {
preparedStatement.setNull(_int, sqlTypes()[0]);
// preparedStatement.setClob(1,Hibernate.createClob(" "));
}

}catch(Exception e){
e.printStackTrace();
}
我使用的是JB2005(编译器),Oracle 9.2.0.1.0(企业版),Hibernate 3.0,JDBC thin驱动
我也看过很多有关的贴(读取CLOB相关的),JAVA视线论坛,Hibernate官方站点的
(http://www.hibernate.org/76.html,http://www.hibernate.org/56.html)
Oracle官方站点等等.都没有找到合适的解决方案(或许我的悟性太差了)

还有如果使用OCI驱动连接老是有问题:
thin: jdbc:oracle:thin:@192.168.0.18:1521:plan 正确
OCI: jdbc:oracle:oci9:@192.168.0.18:1521:plan 找不到URL这个的错误
提示:我的机子其实装了oracle,由于内存太小(256M),所以数据库没有在本机上.
这还需要装oracle客户端吗?

另外我的配置有的也按照网上朋友所说的做了:
<property name="hibernate.jdbc.batch_size">0</property>
<property name="hibernate.jdbc.use_streams_for_binary">true</property>

<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>

请各位指点迷津,注意这里我只想使用自定义的用户类型方式实现CLOB到String的转换!

请看了此贴的朋友,如果可以解决说说解决办法,或是思想,不能解决的能给我一点建议!

初学JAVA时间不长,学HIBERNATE的时间就更短了,难免犯些低级的错误,请不要笑话!
------------------------------------------------------------------------------------------------------------------------------------------

第一种:
//          StringReader r = new StringReader( (String) object);
//下面的方法写入太多的数据会使CLOB为空,几百个字节没有问题
/*          preparedStatement.setCharacterStream(_int, r,
                                               ( (String) object).length());*/

          preparedStatement.setCharacterStream(_int,
              new InputStreamReader(new ByteArrayInputStream(((String) object).getBytes())),
                                               ( (String) object).length());

第二种:
//下面的方法写入数据的长度有限制
//          preparedStatement.setString(_int,(String) object);         
第三种:
会抛出无法从套接子读取太多数据的异常
我看了一些帖子说先要清楚,可在这里如何才能获得要清空的那个CLOB呢?
而下面的代码只是创建一个临时CLOB,然后对其写入数据,然后setClob().
      DatabaseMetaData dbMetaData = ps.getConnection().getMetaData();
      log.debug(dbMetaData.getDriverName());
      log.debug(dbMetaData.getDriverMajorVersion() + " " + dbMetaData.getDriverMinorVersion());
      log.debug(dbMetaData.getConnection().getClass().getName());

      if (value == null) {
          ps.setNull(index, sqlTypes()[0]);
      } else if (ORACLE_DRIVER_NAME.equals(dbMetaData.getDriverName())) {
          if ((dbMetaData.getDriverMajorVersion() >= ORACLE_DRIVER_MAJOR_VERSION) &&
                  (dbMetaData.getDriverMinorVersion() >= ORACLE_DRIVER_MINOR_VERSION)) {
              try {
                  // Code compliments of Scott Miller
                  // support oracle clobs without requiring oracle libraries
                  // at compile time
                  // Note this assumes that if you are using the Oracle Driver.
                  // then you have access to the oracle.sql.CLOB class
                  // First get the oracle clob class
                  Class oracleClobClass = Class.forName("oracle.sql.CLOB");

                  // Get the oracle connection class for checking
                  Class oracleConnectionClass = Class.forName("oracle.jdbc.OracleConnection");

                  // now get the static factory method
                  Class[] partypes = new Class[3];
                  partypes[0] = Connection.class;
                  partypes[1] = Boolean.TYPE;
                  partypes[2] = Integer.TYPE;
                  Method createTemporaryMethod = oracleClobClass.getDeclaredMethod("createTemporary", partypes);

                  // now get ready to call the factory method
                  Field durationSessionField = oracleClobClass.getField("DURATION_SESSION");
                  Object[] arglist = new Object[3];

                  //changed from: Connection conn = ps.getConnection();
                  Connection conn = dbMetaData.getConnection();

                  // Make sure connection object is right type
                  if (!oracleConnectionClass.isAssignableFrom(conn.getClass())) {
                      throw new HibernateException("JDBC connection object must be a oracle.jdbc.OracleConnection. " +
                          "Connection class is " + conn.getClass().getName());
                  }

                  arglist[0] = conn;
                  arglist[1] = Boolean.TRUE;
                  arglist[2] = durationSessionField.get(null); //null is valid because of static field

                  // Create our CLOB
                  Object tempClob = createTemporaryMethod.invoke(null, arglist); //null is valid because of static method

                  // get the open method
                  partypes = new Class[1];
                  partypes[0] = Integer.TYPE;

                  Method openMethod = oracleClobClass.getDeclaredMethod("open", partypes);

                  // prepare to call the method
                  Field modeReadWriteField = oracleClobClass.getField("MODE_READWRITE");
                  arglist = new Object[1];
                  arglist[0] = modeReadWriteField.get(null); //null is valid because of static field

                  // call open(CLOB.MODE_READWRITE);
                  openMethod.invoke(tempClob, arglist);
                  // get the getCharacterOutputStream method
                  Method getCharacterOutputStreamMethod = oracleClobClass.getDeclaredMethod("getCharacterOutputStream",
                          null);

                  // call the getCharacterOutpitStream method
                  Writer tempClobWriter = (Writer) getCharacterOutputStreamMethod.invoke(tempClob, null);

                  // write the string to the clob
                  tempClobWriter.write((String) value);
                  tempClobWriter.flush();
                  tempClobWriter.close();

                  // get the close method
                  Method closeMethod = oracleClobClass.getDeclaredMethod("close", null);

                  // call the close method
                  closeMethod.invoke(tempClob, null);

                  // add the clob to the statement
                  ps.setClob(index, (Clob) tempClob);

                  LobCleanUpInterceptor.registerTempLobs(tempClob);
              } catch (ClassNotFoundException e) {
                  // could not find the class with reflection
                  throw new HibernateException("Unable to find a required class.\n" + e.getMessage());
              } catch (NoSuchMethodException e) {
                  // could not find the metho with reflection
                  throw new HibernateException("Unable to find a required method.\n" + e.getMessage());
              } catch (NoSuchFieldException e) {
                  // could not find the field with reflection
                  throw new HibernateException("Unable to find a required field.\n" + e.getMessage());
              } catch (IllegalAccessException e) {
                  throw new HibernateException("Unable to access a required method or field.\n" + e.getMessage());
              } catch (InvocationTargetException e) {
                  throw new HibernateException(e.getMessage());
              } catch (IOException e) {
                  throw new HibernateException(e.getMessage());
              }
          } else {
              throw new HibernateException("No CLOBS support. Use driver version " + ORACLE_DRIVER_MAJOR_VERSION +
                  ", minor " + ORACLE_DRIVER_MINOR_VERSION);
          }
      } else {
          String str = (String) value;
          StringReader r = new StringReader(str);
          ps.setCharacterStream(index, r, str.length());
      }             
注意:LobCleanUpInterceptor我已经实现,并且在openSession()时这样写的openSession(new LobCleanUpInterceptor())
分享到:
评论

相关推荐

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    在使用 WebLogic 服务器进行应用程序开发时,尤其是在处理 Oracle 数据库中的 CLOB 类型数据时,开发者可能会遇到类型转换的问题。本文将详细介绍如何通过反射机制来解决 WebLogic 环境下 Oracle CLOB 类型转换成 `...

    mybatis 对clob类型转换

    总结,处理MyBatis中的CLOB类型转换,主要涉及自定义TypeHandler、配置MyBatis、在Mapper中应用TypeHandler,以及在编程时考虑异常处理和性能优化。通过这些步骤,可以有效地管理和操作CLOB类型数据,解决插入数据库...

    ORACLE中CLOB字段转String类型

    本文将详细介绍如何在Oracle中实现CLOB字段到字符串类型的转换,并探讨其中的关键技术和注意事项。 #### 一、CLOB概述 1. **定义**: - `CLOB`是Oracle数据库提供的一种特殊的数据类型,用于存储大文本数据。 - ...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    String text = clob.getSubString(1, (int) clob.length()); ``` 总结起来,在Hibernate中处理Oracle数据库中的Clob和Blob字段,主要涉及以下几个步骤: 1. 在实体类中定义Clob和Blob字段,并使用`@Lob`注解。 2. ...

    hibernate动态映射表处理oracle的clob类型

    String content = clob.getSubString(1, (int) clob.length()); // 写入 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); entity.setLongText(clob); ...

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

    为了简化处理,可以将Clob中的数据转换为String,利用Hibernate的String类型映射。在写入时,先将字符串转换为Clob对象,再由Hibernate处理;读取时,将Clob内容转化为字符串。这种方式适用于数据量不是特别大的...

    Hibernate存储Clob字段的方式总结

    Hibernate存储Clob字段的方式总结涉及了在Java开发中...在实际开发中,可以根据需求选择使用String直接映射Clob的方式或者使用Clob类型处理方式,并注意Hibernate session的创建和管理方法,以保证代码的简洁性与效率。

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

    在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...

    数据库中clob类型转换的问题 数据库中clob类型转换的问题

    在探讨“数据库中CLOB类型转换的问题”这一主题时,我们首先需要理解CLOB(Character Large Object)数据类型的基本概念及其在数据库中的应用场景。随后,将深入分析CLOB类型转换过程中可能遇到的问题,并提供相应的...

    spring+hibernate操作oracle的clob字段

    在Java实体类中,表示CLOB字段的属性应为`String`类型,这样可以直接存储和读取文本内容。在Hibernate的映射文件中,使用`org.springframework.orm.hibernate3.support.ClobStringType`类型来映射这个属性,如下所...

    jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标

    标题中的“jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标”涉及到三个主要的Java数据库编程知识点:JDBC连接、Oracle数据库中的CLOB类型处理以及通过Java调用存储过程处理输出游标。 1. JDBC...

    Hibernate对BLOB CLOB操作

    为了实际读取和写入BLOB和CLOB,你需要从文件系统读取数据,然后将其转换为InputStream或Reader,再使用Hibernate提供的方法。例如,你可以使用FileInputStream读取文件,然后将它转换为BLOB,类似地,使用...

    String_clob.zip_oracle

    String content = clob.getSubString(1, (int) clob.length()); ``` 或者,如果需要流式处理大数据,可以使用`Reader`: ```java Reader reader = clob.getCharacterStream(); BufferedReader br = new ...

    oracle(blob转换为clob)

    接下来,使用`DBMS_LOB.SUBSTR`按块读取BLOB数据,将其转换为`VARCHAR2`类型,再使用`DBMS_LOB.WRITEAPPEND`将转换后的数据写入到CLOB中。最后返回转换后的CLOB数据。 #### 4. 更新表中的数据 在实际应用中,一旦...

    运用Java如何存取Oracle中的CLOB类型字段

    - 使用`CLOB.setString()`方法设置CLOB的内容。 - 使用`PreparedStatement`和`setClob()`方法更新CLOB数据。 - 对第二条记录执行相同的查询和更新操作。 5. **关闭连接和释放资源:** - 在完成所有操作后,确保...

    hibernate存取oracle的clob

    InputStreamReader reader = new InputStreamReader(clob.getAsciiStream()); BufferedReader bufferedReader = new BufferedReader(reader); String line; StringBuilder sb = new StringBuilder(); while ((line ...

    jdbc_blob_clob.rar

    标题“jdbc_blob_clob.rar”暗示了这个压缩包文件包含的内容与Java Database Connectivity (JDBC) 中处理Blob和Clob对象相关的知识。Blob是Binary Large Object的缩写,用于存储大块二进制数据,如图片、音频或视频...

    spring+hibernate 解决大字段(clob)

    ### Spring与Hibernate处理大字段(CLOB/BLOB) 在企业级应用开发中,经常会遇到需要存储大量文本或二进制数据的情况,这时就需要用到数据库的大字段类型如CLOB(Character Large Object)和BLOB(Binary Large ...

    oracle Blob转换Clob

    - 使用`UTL_RAW.CAST_TO_VARCHAR2`进行类型转换。 - 通过`DBMS_LOB.WRITE_APPEND`方法将转换后的数据追加到临时Clob中。 4. **返回转换后的Clob**: - 函数最终返回整个转换后的Clob数据。 #### 知识点五:注意...

Global site tag (gtag.js) - Google Analytics