簡單看了一下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類型的實例。
最后如下修改:
OK,搞定,哦也~