java.lang.ClassCastException: oracle.sql.CLOB cannot be cast to oracle.sql.CLOB
来源:互联网 发布:面试官面试技巧知乎 编辑:程序博客网 时间:2024/06/06 19:19
==================================================
Hibernate操作Blob/Clob时,发生cannot be cast to oracle.sql.BLOB错误分析
博客分类: JAVA、WEB开发
OracleSQLHibernateJavaTomcat
作者:隔壁老王(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类型这令人费解的问题了。
解决方法很简单,不过是我花了一整天的时间找到的。
Java代码 收藏代码
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包删掉即可。
Hibernate操作Blob/Clob时,发生cannot be cast to oracle.sql.BLOB错误分析
博客分类: JAVA、WEB开发
OracleSQLHibernateJavaTomcat
作者:隔壁老王(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类型这令人费解的问题了。
解决方法很简单,不过是我花了一整天的时间找到的。
Java代码 收藏代码
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包删掉即可。
0 0
- java.lang.ClassCastException: oracle.sql.CLOB cannot be cast to oracle.sql.CLOB
- java.lang.ClassCastException: java.lang.String cannot be cast to java.sql.Clob
- java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to oracle.sql.BLOB
- java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to oracle.sql.BLOB
- java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to oracle.sql.BLOB
- Hibernate操作Blob/Clob时,发生ClassCastException:$Proxy263 cannot be cast to oracle.sql.BLOB错误分析
- java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp
- oracle.sql.CLOB不能转换成oracle.sql.CLOB类型的异常 java.lang.ClassCastException: oracle.sql.CLOB
- Hibernate操作Blob/Clob时,发生cannot be cast to oracle.sql.BLOB错误分析
- Hibernate操作Blob/Clob时,发生cannot be cast to oracle.sql.BLOB错误分析
- Hibernate操作Blob/Clob时,发生cannot be cast to oracle.sql.BLOB错误分析
- java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp 翻译 2017年08月2
- java.lang.ClassCastException java.sql.Timestamp cannot be cast to java.lang.String
- java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection异常问题解决
- java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection异常问题解决
- java.lang.ClasCastException: oracle.sql.CLOB incompatible with oracle.sql.CLOB
- java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to ]
- java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to
- Hibernate 一对一外键双向关联
- 国密SKF接口函数介绍之三:应用管理函数
- 搜索框智能提示ajax
- kafka增加topic 的partitions数量
- Java 实例说明 &&和&的区别
- java.lang.ClassCastException: oracle.sql.CLOB cannot be cast to oracle.sql.CLOB
- Lambda表达式
- MySQL数据库多表查询
- 优化UITableViewCell高度计算的那些事
- Keil代码整体偏移和查找功能
- TestNG入门——注解之@Test
- LeetCode 6. ZigZag Conversion(Python)兼翻译
- oracle导入空间数据
- SELinux/SEAndroid 实例简述(一) 基础概念