作者:隔壁老王(wallimn.iteye.com),本人原创,欢迎转载,转载请保留此信息。2010-06-19
环境:Hibernate3.5.2、jdk1.6、Oracle9.2.0.8、odbc14(9.2.0.8).jar、连接池proxool0.9.1、tomcat6.0
操作Blob时,对Hibernate返回的BLOB类型的实例blob进行强制类型转换时,
即:(oracle.sql.BLOB)blob,
发生类型转换错误(java.lang.ClassCastException),提示信息为cannot be cast to oracle.sql.BLOB,非常奇怪,这似乎不应该呀。
简单看了一下Hibernate的相关源码,原来由Hibernate返回的blob对象实际上是代理类SerializableBlobProxy的实例,提供了java.sql.Blob接口定义的方法(实际上是通过反射的方式),表现得像是个实现java.sql.Blob接口的对象(只是貌似),但实际上是个Proxy类型的实例,因此不能把这个实例转化成oracle.sql.BLOB类型。
当用System.out.println(blob)输出信息的时候,显示的是oracle.sql.BLOB@10fba68,很具迷惑性。但使用System.out.println(blob.getClass().getName())输出信息的时候,显示的是$Proxy6,这显示了真实的情况,也就是说显示了这个实例的真实面目。
一句话,这个实例是个穿着java.sql.Blob马甲的Proxy类型的实例。
原因找到了,解决起来也就不难了。不必困扰于为什么oracle.sql.BLOB类型的实例不能强制转化成oracle.sql.BLOB类型这令人费解的问题了。
解决方法很简单,不过是我花了一整天的时间找到的。
SerializableBlobProxy proxy = (SerializableBlobProxy )Proxy.getInvocationHandler(blob);
java.sql.Blob realBlob = proxy.getWrappedBlob();
这样得到的realBlob,是个真正的oracle.sql.BLOB对象,可以进行类型转化了。
另外:
经测试,对realBlob实例执行setBinaryStream(1L)方法时,会报异常。Oracle不支持这个方法,反编译odbc14.jar看了一下源码,调用这个方法,会直接抛出异常。
不使用hibernate时,也可能会遇到这个问题。估计只要系统中用到动态代理技术,都有可能遇到这个怪异的类型转化异常(java.lang.ClassCastException)问题。解决方法应该是类似的。
还有,如果使用tomcat容器以及容器带的DBCP连接池,当tomcat的共享包目录中放的jdbc包与工程中带的jdbc包的版本不一致的时候,也可能引发这个错误。这种情况下,只要把工程中带的jdbc包删掉即可。
分享到:
相关推荐
这是因为 WebLogic 服务器为了更好地管理和操作数据库连接,会使用自己的包装类 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 来表示 CLOB 类型的数据,而不是直接使用 Oracle 提供的标准 `oracle.sql.CLOB` 类。...
oracle的jdbc驱动程序,用这个版本的操作Clob,blob类型的数据很方便。 博文链接:https://zhenjw.iteye.com/blog/173419
在Java Web开发中,...本文将详细介绍如何在Hibernate中操作Blob和Clob字段,实现数据的存储与读取。 首先,我们需要在Hibernate映射文件(.hbm.xml)中定义Blob和Clob字段。对于Blob,可以这样声明: ```xml ...
rt,出现这种情况,可以更换下hibernate核心包 即可解决
在使用Hibernate操作BLOB和CLOB时,需要注意一些潜在的问题,比如内存管理,因为大数据对象可能会占用大量内存。另外,对于大文件的读写,可能需要分块处理,避免一次性加载整个文件到内存。同时,确保数据库支持...
在某些情况下,可能需要将BLOB类型的数据转换为CLOB类型,例如,在处理文本数据时,如果数据被错误地存储为BLOB,或者需要将二进制数据中的可读文本部分提取出来进行处理。本文将详细介绍如何使用Oracle内置函数和...
在Java的持久化框架Hibernate中,Blob和Clob对象是用来处理大数据类型的,它们分别对应数据库中的BLOB(Binary Large Object)和CLOB(Character Large Object)。这篇文章将详细讲解如何在Hibernate中保存这两种...
InputStream blobInput = blob.getBinaryStream(); ``` ### 5. 文件流操作 无论是Hibernate还是JDBC,获取到Blob的输入流后,你可能需要将其保存到本地文件或者进行其他处理。这涉及到文件流的读写操作: ```java...
### JDBC中操作Blob、Clob等对象 #### 一、简介 在JDBC(Java Database Connectivity)编程中,Blob和Clob是非常重要的数据类型。Blob(Binary Large Object)主要用于存储二进制大对象,如图像、音频文件等;而Clob...
### Oracle Blob转换Clob #### 知识点一:Oracle Blob与Clob的基本概念 - **Blob (Binary Large Object)**:在Oracle数据库中,Blob类型用于存储大量的二进制数据,如图像、视频或文档等非结构化数据。 - **Clob ...
3. 处理方式:对BLOB进行操作时,通常涉及二进制文件的读写,例如图片的上传和下载。CLOB操作则更偏向于文本内容的处理,如文本编辑、搜索等。 在Oracle数据库中,插入和查询BLOB和CLOB对象有特定的方法: 1. 插入...
标题"Clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle"暗示了这个压缩包包含的资源是关于使用Java操作Oracle数据库中的CLOB和BLOB字段的示例代码。这个压缩包可能包含了一个名为`clob-blob.java`...
MyBatis 处理 CLOB、BLOB 类型数据是指在使用 MyBatis 框架时,如何正确地处理大字段类型的数据。CLOB(Character Large OBject)和 BLOB(Binary Large OBject)都是大字段类型,用于存储大量的数据。 CLOB 类型...
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR"); Writer outStream = clob.getCharacterOutputStream(); char[] c = data.toCharArray(); outStream.write(c, 0, c.length); } outStream....
在使用 Java 进行 Oracle 数据库操作时,理解 Blob 和 Clob 类型及其操作方法至关重要。通过合理选择 JDBC 版本和适配容器特性,可以有效地管理大容量数据,提高应用程序的性能和稳定性。此外,还需要关注不同容器...