因为后面要对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();
......
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();
......
解决方案 »
- hibernate weblogic JDNI 配置找不到DataSource
- struts2接收表单值的问题
- 求助: Eclipse连接不上webservice, 一直超时
- java的类型转换问题
- 国内各大优秀免费源码下载站集合!
- 求大神指教 给HashMap还赋不上值了
- !!求助!!配置JBoss4.0.2
- Stateful Session Bean 调用ejbPassivate()挂起后,其状态是如何保存的?
- Java通过URL截取网页快照并保存到指定目录--项目中不能连续截取
- 一个html页面的搜索框不是form表单,那么如何往controller中传值?
- webservice的测试问题
- 在线等:哪里有jstl的说明文档?
看看它是不是实现 了java.sql.Blob接口?
直接转换成ORACLE的HibernateUtil.currentSession().flush();
HibernateUtil.currentSession().refresh(blog, LockMode.UPGRADE);
SerializableBlob sb = (SerializableBlob) blog.getLogo();
oracle.sql.BLOB blob = (oracle.sql.BLOB) sb.getWrappedBlob();
怎么看不出来程序的问题?
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什么的
<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>
CRBT是一个没问题的ORACLE的JDBC驱动是吧
你试试吧
如果还有问题
那SerializableBlob sb = (SerializableBlob) blog.getLogo();
把blog的定义变掉
只把这个LOGO属性定义成java.sql.Blob
不要使用SerializableBlob
我开始是这样用的:
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; //异常但还是一样的异常
怎么这样阿
你干脆把它就定义成oracle.sql.BLOB
然后因为oracle.sql.BLOB也是Blob的Interface所以
HIBERNATE应该也能填入并返回
你试试好了
其实我建议你如果非必要 不要使用高版 本的
不稳定 尤其是JDK1.5以后的 新出来支持它的各路人马都有或大或小的问题
if (wrapBlob instanceof oracle.sql.BLOB){
...
} else {
System.out.println(wrapBlob);
}
进的是else分之,打印结果如下:
oracle.sql.BLOB@100200c更迷惑了
只是留个名称和位置在那里 再试试呢?
不行的话就降HIBERNATE的版本吧
没办法的
你看看是否在你的服务器上面存在两个classes12.zip/jar,特别是你的WEB-INF/lib中是否也存在一份?最好只保留一份
修改 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连接池调用的是哪个驱动程序文件
Tomcat连接池采用的:common/lib/ojdbc14.jar
jdbc驱动采用的是:WEB-INF/lib/ojdbc14.jar我两个文件是一样的
环境的问题...
TOMCAT很怪 尤其是高版本更严重
你最好把它需要的所有包的单份COPY到它的LIB目录下
而且只保留这一份
这对俺 来说也是个教训阿
没想到是这个问题
用连接池和用JDBC直连有什么差异嘛?(我的jdbc驱动文件是一样的)