论坛首页 Java企业应用论坛

使用JDBC和Hibernate来写入Blob型数据到Oracle中

浏览 98015 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-01-04  
测了一下,用10G的驱动,在HBM.XML中直接定义为STRING类型,8I都可以直接写入了
爽!!!

后来又测了一下,只可写,不可读
郁闷
只能用以前的老办法处理了
0 请登录后投票
   发表时间:2006-01-18  
报错代码如下:
我采用robbin写的读写Blog类型的方法,当第一次调用的时候可以,如果我刷新多次,就会出现这样的错误

我的配置是:oracle9i+hibernate2.1.6+class12.jar(驱动)+jboss4.1sp1

09:41:38,881 WARN  [JDBCExceptionReporter] SQL Error: 1002, SQLState: 72000
09:41:38,881 ERROR [JDBCExceptionReporter] ORA-01002: 读取违反顺序

09:41:38,881 WARN  [JDBCExceptionReporter] SQL Error: 1002, SQLState: 72000
09:41:38,881 ERROR [JDBCExceptionReporter] ORA-01002: 读取违反顺序

09:41:38,881 ERROR [JDBCExceptionReporter] could not load: [com.bachcenter.trip.pojo.OrderLog#4028889208db19cc0108db2c97920005]
java.sql.SQLException: ORA-01002: 读取违反顺序

	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180);
	at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208);
	at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543);
	at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1451);
	at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:943);
	at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2126);
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2331);
	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:422);
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:366);
	at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:296);
	at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:87);
	at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:875);
	at net.sf.hibernate.loader.Loader.doQuery(Loader.java:269);
	at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133);
	at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:911);
	at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:931);
	at net.sf.hibernate.loader.SimpleEntityLoader.load(SimpleEntityLoader.java:58);
	at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:419);
	at net.sf.hibernate.impl.SessionImpl.refresh(SessionImpl.java:2183);
	at com.chinabach.baksys.concreteface.implHotel.add(implHotel.java:281);
	at com.bachcenter.trip.action.sysbak.AddlogAction.execute(AddlogAction.java:46);
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484);
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274);
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482);
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507);
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:697);
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157);
	at com.bachcenter.trip.TripFilter.doFilter(TripFilter.java:47);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157);
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:75);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157);
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198);
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:66);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:150);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:54);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929);
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160);
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799);
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705);
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577);
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683);
	at java.lang.Thread.run(Thread.java:595);
09:41:39,084 INFO  [STDOUT] net.sf.hibernate.JDBCException: could not load: [com.bachcenter.trip.pojo.OrderLog#4028889208db19cc0108db2c97920005]
	at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:422);
	at net.sf.hibernate.impl.SessionImpl.refresh(SessionImpl.java:2183);
	at com.chinabach.baksys.concreteface.implHotel.add(implHotel.java:281);
	at com.bachcenter.trip.action.sysbak.AddlogAction.execute(AddlogAction.java:46);
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484);
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274);
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482);
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507);
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:697);
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157);
	at com.bachcenter.trip.TripFilter.doFilter(TripFilter.java:47);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157);
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:75);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157);
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198);
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:66);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:150);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:54);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109);
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104);
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520);
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929);
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160);
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799);
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705);
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577);
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683);
	at java.lang.Thread.run(Thread.java:595);
Caused by: java.sql.SQLException: ORA-01002: 读取违反顺序

	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180);
	at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208);
	at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543);
	at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1451);
	at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:943);
	at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2126);
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2331);
	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:422);
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:366);
	at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:296);
	at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:87);
	at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:875);
	at net.sf.hibernate.loader.Loader.doQuery(Loader.java:269);
	at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133);
	at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:911);
	at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:931);
	at net.sf.hibernate.loader.SimpleEntityLoader.load(SimpleEntityLoader.java:58);
	at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:419);
	... 45 more


0 请登录后投票
   发表时间:2006-01-18  
如果能用spring的话处理大字段将很方便,当然在更新大字段时一定要用spring的事务处理进行更新操作
0 请登录后投票
   发表时间:2006-04-25  
scud 写道
karna 写道
robbin 写道
blob在Oracle中就是一种很特殊的数据类型,操作方法就是不通用的,也没有办法通用。如果为了程序的跨数据库通用性考虑,就必须采用long型,而不能采用blob/clob



谁说没办法通用的,偶写的一个持久层,把blob映射为byte[],clob映射为char[],操作他们和操作其它数据库的大字段是一样的,把oracle的blob/clob移植到sybase的image/text,甚至access的OLE对象,不需要修改一行代码和配置


oracle9,oracle10倒是可以

你试过在8i上通用的吗  我很为此烦恼(替别人烦恼)


说得很过分哈!8i的现在很少了,基本都升级了!
0 请登录后投票
   发表时间:2006-04-26  
aflyer 写道
scud 写道
karna 写道
robbin 写道
blob在Oracle中就是一种很特殊的数据类型,操作方法就是不通用的,也没有办法通用。如果为了程序的跨数据库通用性考虑,就必须采用long型,而不能采用blob/clob



谁说没办法通用的,偶写的一个持久层,把blob映射为byte[],clob映射为char[],操作他们和操作其它数据库的大字段是一样的,把oracle的blob/clob移植到sybase的image/text,甚至access的OLE对象,不需要修改一行代码和配置


oracle9,oracle10倒是可以

你试过在8i上通用的吗  我很为此烦恼(替别人烦恼)


说得很过分哈!8i的现在很少了,基本都升级了!

8i还是很多在用的系统 不是说升级就升级的
0 请登录后投票
   发表时间:2006-04-28  
BLOB blob = (BLOB) c.getImage();
会抛出异常,不能强制转换
绝对区分开了大小写的问题,后来经过多方搜索得到的解决方案是:通过org.hibernate.lob.SerializableBlob 来进行转换,代码如下:
   SerializableBlob blob = (SerializableBlob)pi.getUserphoto();
   BLOB blob2 = (BLOB) blob.getWrappedBlob

用这种方法的前提是,Hibernate的连结配置必需是JDBC,换成JNDI就不成,郁闷。。。
0 请登录后投票
   发表时间:2006-04-30  
session.refresh(addFile, LockMode.UPGRADE);;
			SerializableBlob sb = (SerializableBlob);addFile.getAfile();; 
			BLOB blob = (BLOB); sb.getWrappedBlob();;
			OutputStream out = blob.getBinaryOutputStream();;
			String fileName = "xxx.jar";
			File f = new File(fileName);;
			FileInputStream fin = new FileInputStream(f);;
			int count = -1, total = 0;
			byte[] data = new byte[(int); fin.available();];
			fin.read(data);;
			out.write(data);;
			fin.close();;
			out.close();;
			session.flush();;


这段代码我没有太明白,直接就吧文件读取成byte[],然后save不行嘛?如果必须这样做的话,哪我从页面提交过来的byte[]是不是还要储存成文件,然后执行这样的操作呢?

也就是说,我从jsp进行文件上载,然后在从本地把上载的文件储存到数据库中,转化为文件这一步必须做嘛?
0 请登录后投票
   发表时间:2006-06-26  
出现blob ClassCastException的问题,都不是上述原因。

我也是无意中发现的,关键在于

session.refresh(entity, LockMode.UPGRADE); —— (1)

BLOB blob = (BLOB) entity.getImage(); ——(2)
的执行次序问题,

如果没有执行(1),而直接使用(2)获得blob,则获得的是hibernate的BlobImpl对象,出现类型转换错误;但是运行次序为(1)(2),则获得的是oracle.sql.BLOB对象,不会抛异常。
0 请登录后投票
   发表时间:2006-12-26  

lovehibernate 兄,真的非常感谢。

使用你说的转型为SerializableBlob,然后getWrapBlob,

转型为oracle.sql.BLOB的方法我真的解决了在hibernate3中

写入BLOB数据的问题。原来以为这是hibernate3的一个bug,

以为在hibernate3中是不能写入BLOb数据的结果使用你的方法就

成功了!!

    但是我还有一个疑问?你能不能把你解决这个问题的思路贴出来,比如怎么想到

要转型为SerializableBlob,然后又调用getWrapBlob?这里面有些什么道理呢?

     再次感谢!!!

0 请登录后投票
   发表时间:2007-04-06  
最近工作中就遇到了这个问题,在这里找到了解决问题的方法.

真的太感谢了!看看这个贴子挺老的了,可是对我还是有帮助真是好贴子呀!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics