当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
hibernate操作oracle的blob字段
发布时间:2010/7/11 13:44:49 来源:城市学习网 编辑:ziteng

  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();

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved