终于可以发贴了,在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 服务器进行应用程序开发时,尤其是在处理 Oracle 数据库中的 CLOB 类型数据时,开发者可能会遇到类型转换的问题。本文将详细介绍如何通过反射机制来解决 WebLogic 环境下 Oracle CLOB 类型转换成 `...
总结,处理MyBatis中的CLOB类型转换,主要涉及自定义TypeHandler、配置MyBatis、在Mapper中应用TypeHandler,以及在编程时考虑异常处理和性能优化。通过这些步骤,可以有效地管理和操作CLOB类型数据,解决插入数据库...
本文将详细介绍如何在Oracle中实现CLOB字段到字符串类型的转换,并探讨其中的关键技术和注意事项。 #### 一、CLOB概述 1. **定义**: - `CLOB`是Oracle数据库提供的一种特殊的数据类型,用于存储大文本数据。 - ...
String text = clob.getSubString(1, (int) clob.length()); ``` 总结起来,在Hibernate中处理Oracle数据库中的Clob和Blob字段,主要涉及以下几个步骤: 1. 在实体类中定义Clob和Blob字段,并使用`@Lob`注解。 2. ...
String content = clob.getSubString(1, (int) clob.length()); // 写入 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); entity.setLongText(clob); ...
为了简化处理,可以将Clob中的数据转换为String,利用Hibernate的String类型映射。在写入时,先将字符串转换为Clob对象,再由Hibernate处理;读取时,将Clob内容转化为字符串。这种方式适用于数据量不是特别大的...
Hibernate存储Clob字段的方式总结涉及了在Java开发中...在实际开发中,可以根据需求选择使用String直接映射Clob的方式或者使用Clob类型处理方式,并注意Hibernate session的创建和管理方法,以保证代码的简洁性与效率。
在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...
在探讨“数据库中CLOB类型转换的问题”这一主题时,我们首先需要理解CLOB(Character Large Object)数据类型的基本概念及其在数据库中的应用场景。随后,将深入分析CLOB类型转换过程中可能遇到的问题,并提供相应的...
在Java实体类中,表示CLOB字段的属性应为`String`类型,这样可以直接存储和读取文本内容。在Hibernate的映射文件中,使用`org.springframework.orm.hibernate3.support.ClobStringType`类型来映射这个属性,如下所...
标题中的“jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标”涉及到三个主要的Java数据库编程知识点:JDBC连接、Oracle数据库中的CLOB类型处理以及通过Java调用存储过程处理输出游标。 1. JDBC...
为了实际读取和写入BLOB和CLOB,你需要从文件系统读取数据,然后将其转换为InputStream或Reader,再使用Hibernate提供的方法。例如,你可以使用FileInputStream读取文件,然后将它转换为BLOB,类似地,使用...
String content = clob.getSubString(1, (int) clob.length()); ``` 或者,如果需要流式处理大数据,可以使用`Reader`: ```java Reader reader = clob.getCharacterStream(); BufferedReader br = new ...
接下来,使用`DBMS_LOB.SUBSTR`按块读取BLOB数据,将其转换为`VARCHAR2`类型,再使用`DBMS_LOB.WRITEAPPEND`将转换后的数据写入到CLOB中。最后返回转换后的CLOB数据。 #### 4. 更新表中的数据 在实际应用中,一旦...
- 使用`CLOB.setString()`方法设置CLOB的内容。 - 使用`PreparedStatement`和`setClob()`方法更新CLOB数据。 - 对第二条记录执行相同的查询和更新操作。 5. **关闭连接和释放资源:** - 在完成所有操作后,确保...
InputStreamReader reader = new InputStreamReader(clob.getAsciiStream()); BufferedReader bufferedReader = new BufferedReader(reader); String line; StringBuilder sb = new StringBuilder(); while ((line ...
标题“jdbc_blob_clob.rar”暗示了这个压缩包文件包含的内容与Java Database Connectivity (JDBC) 中处理Blob和Clob对象相关的知识。Blob是Binary Large Object的缩写,用于存储大块二进制数据,如图片、音频或视频...
### Spring与Hibernate处理大字段(CLOB/BLOB) 在企业级应用开发中,经常会遇到需要存储大量文本或二进制数据的情况,这时就需要用到数据库的大字段类型如CLOB(Character Large Object)和BLOB(Binary Large ...
- 使用`UTL_RAW.CAST_TO_VARCHAR2`进行类型转换。 - 通过`DBMS_LOB.WRITE_APPEND`方法将转换后的数据追加到临时Clob中。 4. **返回转换后的Clob**: - 函数最终返回整个转换后的Clob数据。 #### 知识点五:注意...