免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1278 | 回复: 0
打印 上一主题 下一主题

hibernate操作oracle的blob字段 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-31 22:51 |只看该作者 |倒序浏览
1. Bolb类型字段说明:

  写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?

  这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。

  2. 获取游标存在的问题:

  因为我使用的是weblogic配置的数据源,weblogic做了一些封装,返回来的blob的是weblogic.jdbc.wrapper.Blob对象,不能直接转化为oracle的JDBC的oracleBlob,否则产生转型异常Cast Exception:

  代码示例:

  //PO:CardSuitInfo

  public class CardSuitInfo implements Serializable ...{

  private java.sql.Blob cardFacePicFile;

  public void setCardFacePicFile(Blob cardFacePicFile) ...{

  this.cardFacePicFile = cardFacePicFile;

  }

  public java.sql.Blob getCardFacePicFile() ...{

  return this.cardFacePicFile;

  }

  }

  //1.首先插入空的blob

  cardSuitInfo.setCardFacePicFile(net.sf.hibernate.Hibernate.createBlob(new byte[1]));

  session.save(cardSuitInfo);

  session.flush();

  //2.写入blob

  session.refresh(cardSuitInfo, LockMode.UPGRADE);// 设置锁定级别

  weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardFacePicFile();

  oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();

  OutputStream out = oracleBlob.getBinaryOutputStream();

  byte[] buffer = cardSuitInfoView.getCardFacePicFileBody();

  out.write(buffer, 0, buffer.length);

  out.close();

  session.save(cardSuitInfo);

  读取blob字段:

  ......

  ......

  weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();

  oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();

  BufferedInputStream in = new BufferedInputStream(oracleBlob.getBinaryStream());

  long picLong = cardSuitInfo.getCardBackPicFile().length();

  byte[] bytes = new byte[Integer.parseInt(picLong + \"\")];//

  int result = in.read(bytes);

  if (result > 0) ...{

  downloadFileView.setFileByteArray(bytes);

  }

  in.close();

  ......

  ......

  3.总结:

  weblogic进行的封装,使我们必须加这步转换,如果用jdbc操作就不会出现此问题,而直接可以转化为oracle.sql.BLOB的对象。

  重点步骤:

  weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();

  oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP