因为后面要对BLOB字段赋值,java.sql.Blob没有getBinaryOutputStream()方法,而BLOB有OutputStream out = blob.getBinaryOutputStream();
File f = blogedit.getLogo()[0];
FileInputStream fin = new FileInputStream(f);
byte[] data = new byte[(int) fin.available()];
fin.read(data);
out.write(data);
fin.close();
out.close();
HibernateUtil.currentSession().flush();
......

解决方案 »

  1.   

    你看一下oracle.sql.BLOB的源码
    看看它是不是实现 了java.sql.Blob接口?
      

  2.   

    public oracle.sql.BLOB extends oracle.sql.DatumWithConnection implements java.sql.Blob
      

  3.   

    那就行了
    直接转换成ORACLE的HibernateUtil.currentSession().flush();
    HibernateUtil.currentSession().refresh(blog, LockMode.UPGRADE);
    SerializableBlob sb = (SerializableBlob) blog.getLogo();
    oracle.sql.BLOB blob = (oracle.sql.BLOB) sb.getWrappedBlob();
      

  4.   

    sb.getWrappedBlob()//别人的名字已经很清楚了吧?被包装起来的Blob,所以它已经显然不再是oracle.sql.BLOB
      

  5.   

    楼上的专家分如此之高
    怎么看不出来程序的问题?
    java.sql.Blob wrapBlob = sb.getWrappedBlob();
    oracle.sql.BLOB blob = (oracle.sql.BLOB) wrapBlob; //异常这里面java.sql.Blob只是一个INTERFACE
    说明这个getWrappedBlob是返回了这样一个INTERFACE
    再看看HIBERNATE的代码
    org.hibernate.lob 
    Class SerializableBlob
    java.lang.Object
      org.hibernate.lob.SerializableBlob
    All Implemented Interfaces: 
    Blob, Serializable oracle.sql.BLOB 实现了java.sql.Blob的接口 
    sb.getWrappedBlob() 返回的正是这样一个接口
    怎么会不再是? 真可笑...
    从低级接口转换成更高层的类很可能会出现楼主所遇到的问题如果直接转换仍然出问题, 那么检查一下HIBERNATE的配置 看看DIALECT什么的
      

  6.   

    <property name="show_sql">true</property>    
        <property name="hibernate.cglib.use_reflection_optimizer">true</property>
        <property name="connection.datasource">java:comp/env/jdbc/crbt</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
      

  7.   

    这样应该没有问题的
    CRBT是一个没问题的ORACLE的JDBC驱动是吧
    你试试吧
    如果还有问题
    那SerializableBlob sb = (SerializableBlob) blog.getLogo();
    把blog的定义变掉
    只把这个LOGO属性定义成java.sql.Blob 
    不要使用SerializableBlob
      

  8.   

    我这个属性本来用的就是java.sql.Blob
    我开始是这样用的:
    oracle.sql.BLOB blob = (oracle.sql.BLOB) blog.getLogo();
    也是报异常,后来到网上查,发现Hibernate3.x(我用3.1)后,Blob的操作修改了
    不能直接读取,必须采用上面的办法
    SerializableBlob sb = (SerializableBlob) blog.getLogo();
    java.sql.Blob wrapBlob = sb.getWrappedBlob();
    oracle.sql.BLOB blob = (oracle.sql.BLOB) wrapBlob;  //异常但还是一样的异常
      

  9.   

    我晕
    怎么这样阿
    你干脆把它就定义成oracle.sql.BLOB
    然后因为oracle.sql.BLOB也是Blob的Interface所以 
    HIBERNATE应该也能填入并返回 
    你试试好了
    其实我建议你如果非必要 不要使用高版 本的
    不稳定 尤其是JDK1.5以后的 新出来支持它的各路人马都有或大或小的问题
      

  10.   

    呵呵,我也试过把属性定义未oracle.sql.BLOB,然后把hibernate.cfg.xml文件中的对应属性修改为oracle.sql.BLOB,这样hibernate不能加载配置文件。
      

  11.   

    我用条件判断:
    if (wrapBlob instanceof oracle.sql.BLOB){
       ...
    } else {
       System.out.println(wrapBlob);
    }
    进的是else分之,打印结果如下:
    oracle.sql.BLOB@100200c更迷惑了
      

  12.   

    你在配置文件中 不要指定它的属性
    只是留个名称和位置在那里 再试试呢?
    不行的话就降HIBERNATE的版本吧
    没办法的
      

  13.   

    如果你确信你打印的信息没有错误,则wrapBlob也是oracle.sql.BLOB类型出现异常的可能是它的ClassLoader和你程序的ClassLoader中都分别加载了一次BLOB,结果造成问题
    你看看是否在你的服务器上面存在两个classes12.zip/jar,特别是你的WEB-INF/lib中是否也存在一份?最好只保留一份
      

  14.   

    问题是解决了,但是不知道原因。解决方法:
    修改 hibernate.cfg.xml 把连接池去掉,改成直接使用jdbc连接接
    <property name="myeclipse.connection.profile">crbt</property>
    <property name="connection.url">jdbc:oracle:thin:@219.136.252.75:1521:oradb</property>
    <property name="connection.username">crbt</property>
    <property name="connection.password">oniongz1234</property>
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property><!--
       <property name="show_sql">true</property>    
       <property name="hibernate.cglib.use_reflection_optimizer">true</property>
       <property name="connection.datasource">java:comp/env/jdbc/crbt</property>
       <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
    -->    我想应该还是ChDw(米)兄说的,可能采用连接池的时候Tomcat加载的不是WEB-INF/lib下面的ojdbc14.jar文件。但是问题是我在Tomcat的share目录下没有另外的oracle的jdbc驱动文件,在common/lib目录下有一个相同的ojdbc14.jar文件。不知道tomcat连接池调用的是哪个驱动程序文件
      

  15.   

    我测试了一下,证明
    Tomcat连接池采用的:common/lib/ojdbc14.jar
    jdbc驱动采用的是:WEB-INF/lib/ojdbc14.jar我两个文件是一样的
      

  16.   

    原来是这样
    环境的问题...
    TOMCAT很怪 尤其是高版本更严重
    你最好把它需要的所有包的单份COPY到它的LIB目录下
    而且只保留这一份
    这对俺 来说也是个教训阿
    没想到是这个问题
      

  17.   

    为什么用连接池会不对?!!
    用连接池和用JDBC直连有什么差异嘛?(我的jdbc驱动文件是一样的)
      

  18.   

    换个别的连接池来源,别用tomcat的,比如用第三方的,jboss或weblogic的试
      

  19.   

    http://hibernate.org/56.html里面有实现的几种方法,楼主可以参考一下