隨筆-72  評(píng)論-63  文章-0  trackbacks-0
          在網(wǎng)上閑逛找到了解決方案:
          ???? 現(xiàn)在3.x中對(duì)blob和clob增加了org.hibernate.lob.SerializableBlob和org.hibernate.lob.SerializableClob類(lèi)的封裝。

          其次如果你將前面的測(cè)試程序放到weblogic的容器中通過(guò)weblogic的數(shù)據(jù)源得到連接的話,你會(huì)發(fā)現(xiàn)oracle.sql.BLOB blob = (oracle.sql.BLOB)person.getImage();和 oracle.sql.CLOB clob = (oracle.sql.CLOB)person.getArticle();這倆行會(huì)出錯(cuò),原因就是weblogic進(jìn)行了包裝。

          現(xiàn)在將以上兩個(gè)問(wèn)題的綜合解決方案用以下代碼說(shuō)明:



          ????????????for (int i = 0; i < 10; i++) {
          ????????????????LargeObject large = new LargeObject();
          ????????????????large.setId(i + "");
          ????????????????large.setName("林意煒");

          ????????????????// 插入一個(gè)小數(shù)據(jù)數(shù)據(jù)
          ????????????????large.setImage(Hibernate.createBlob(new byte[1]));
          ????????????????large.setArticle(Hibernate.createClob(" "));

          ????????????????session.save(large);
          ????????????????session.flush();

          ????????????????// 鎖定該記錄
          ????????????????session.refresh(large, LockMode.UPGRADE);

          ????????????????// 插入圖片數(shù)據(jù)
          ????????????????String fileName = "E:/AAA/" + i + ".jpg";
          ????????????????SerializableBlob sb = (SerializableBlob)large.getImage();
          ????????????????java.sql.Blob wrapBlob = sb.getWrappedBlob();
          ????????????????// 通過(guò)非weblogic容器中數(shù)據(jù)源獲得連接的情況
          ????????????????if(wrapBlob instanceof oracle.sql.BLOB){
          ????????????????????oracle.sql.BLOB blob = (oracle.sql.BLOB) wrapBlob;
          ????????????????????OutputStream out = blob.getBinaryOutputStream();
          ????????????????????out.write(getData(fileName));
          ????????????????????out.close();
          ????????????????}
          ????????????????// 使用weblogic的Oracle Thin driver類(lèi)型連接池,驅(qū)動(dòng)類(lèi)名:oracle.jdbc.OracleDriver
          ????????????????else if(wrapBlob instanceof weblogic.jdbc.vendor.oracle.OracleThinBlob){
          ????????????????????OracleThinBlob blob = (OracleThinBlob)wrapBlob;
          ????????????????????OutputStream out = blob.getBinaryOutputStream();
          ????????????????????out.write(getData(fileName));
          ????????????????????out.close();
          ????????????????}


          ????????????????// 插入文章數(shù)據(jù)
          ????????????????fileName = "E:/AAA/" + i + ".java";
          ????????????????SerializableClob cb = (SerializableClob)large.getArticle();
          ????????????????java.sql.Clob wrapClob = cb.getWrappedClob();
          ????????????????// 通過(guò)非weblogic容器中數(shù)據(jù)源獲得連接的情況
          ????????????????if(wrapClob instanceof oracle.sql.CLOB){
          ????????????????????oracle.sql.CLOB clob = (oracle.sql.CLOB) wrapClob;
          ????????????????????Writer writer = clob.getCharacterOutputStream();
          ????????????????????String article = new String(getData(fileName));
          ????????????????????writer.write(article);
          ????????????????????writer.close();
          ????????????????}
          ????????????????// 使用weblogic的Oracle Thin driver類(lèi)型連接池,驅(qū)動(dòng)類(lèi)名:oracle.jdbc.OracleDriver
          ????????????????else if(wrapClob instanceof weblogic.jdbc.vendor.oracle.OracleThinClob){
          ????????????????????OracleThinClob clob = (OracleThinClob)wrapClob;
          ????????????????????Writer writer = clob.getCharacterOutputStream();
          ????????????????????String article = new String(getData(fileName));
          ????????????????????writer.write(article);
          ????????????????????writer.close();
          ????????????????}
          ????????????}


          ***************************************************
          采用得是ORACLE9i數(shù)據(jù)庫(kù),Jboss或Weblogic。
          JDBC采用ORACLE9i自帶的Class12.jar
          -------------
          數(shù)據(jù)庫(kù)結(jié)構(gòu):
          java代碼:?


          CREATE TABLE SNCPARAMETERS
          (
          ? ID? ? ?NUMBER(19)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NOT NULL,
          ? SNCID? NUMBER(19),
          ? NAME? ?VARCHAR2(255),
          ? VALUE? CLOB
          )


          --------------
          BO采用xdoclet建立的:
          java代碼:?


          publicclass SNCParameters extends BaseObject
          {

          ? ? /**
          ? ? ?* Returns the id.
          ? ? ?*
          ? ? ?* @return? ? ? long
          ? ? ?* @hibernate.id
          ? ? ?*? ? ? ? ? column = "id"
          ? ? ?*? ? ? ? ? type = "long"
          ? ? ?*? ? ? ? ? generator-class = "native"
          ? ? ?*? ? ? ? ? unsaved-value = "null"
          ? ? ?*/

          ? ? publicLong getId()
          ? ? {
          ? ? ? ? return id;
          ? ? }

          ? ? /**
          ? ? ?*? ? Sets the Id attribute of the SNCParameters object
          ? ? ?*
          ? ? ?* @param? ? id? The new Id value
          ? ? ?*/

          ? ? publicvoid setId(Long id)
          ? ? {
          ? ? ? ? this.id = id;
          ? ? }


          ? ? /**
          ? ? ?* Returns the name.
          ? ? ?*
          ? ? ?* @return? ? ? String
          ? ? ?*
          ? ? ?* @hibernate.property
          ? ? ?*? ? ? ? ? column = "name"
          ? ? ?*? ? ? ? ? type = "string"
          ? ? ?*? ? ? ? ? not-null = "true"
          ? ? ?*? ? ? ? ? unique = "false"
          ? ? ?*/


          ? ? publicString getName()
          ? ? {
          ? ? ? ? return name;
          ? ? }

          ? ? /**
          ? ? ?*? ? Sets the Name attribute of the SNCParameters object
          ? ? ?*
          ? ? ?* @param? ? name? The new Name value
          ? ? ?*/

          ? ? publicvoid setName(String name)
          ? ? {
          ? ? ? ? this.name = name;
          ? ? }

          ? ? /**
          ? ? ?* Returns the sncId.
          ? ? ?*
          ? ? ?* @return? ? ? Long
          ? ? ?*
          ? ? ?* @hibernate.property
          ? ? ?*? ? ? ? ? column = "sncId"
          ? ? ?*? ? ? ? ? type = "long"
          ? ? ?*? ? ? ? ? not-null = "true"
          ? ? ?*? ? ? ? ? unique = "false"
          ? ? ?*/


          ? ? publicLong getSncId()
          ? ? {
          ? ? ? ? return sncId;
          ? ? }

          ? ? /**
          ? ? ?*? ? Sets the SncId attribute of the SNCParameters object
          ? ? ?*
          ? ? ?* @param? ? sncId? The new SncId value
          ? ? ?*/

          ? ? publicvoid setSncId(Long sncId)
          ? ? {
          ? ? ? ? this.sncId = sncId;
          ? ? }

          ? ? /**
          ? ? ?* Returns the values.
          ? ? ?*
          ? ? ?* @return? ? ? Clob
          ? ? ?*
          ? ? ?* @hibernate.property
          ? ? ?*? ? ? ? ? column = "value"
          ? ? ?*? ? ? ? ? type = "clob"
          ? ? ?*? ? ? ? ? not-null = "true"
          ? ? ?*? ? ? ? ? unique = "false"
          ? ? ?*/


          ? ? publicClob getValue()
          ? ? {
          ? ? ? ? return value;
          ? ? }

          ? ? /**
          ? ? ?*? ? Sets the Values attribute of the SNCParameters object
          ? ? ?*
          ? ? ?* @param? ? values? The new Values value
          ? ? ?*/

          ? ? publicvoid setValue(Clob value)
          ? ? {
          ? ? ? ? this.value = value;
          ? ? }
          ? ? privateLong id;
          ? ? privateLong sncId;
          ? ? privateString name;
          ? ? privateClob value;
          ? ? privateString valueString;
          ? ? publicString getValueString()
          ? ? {
          ? ? ? ? return valueString;
          ? ? }
          ? ? ? ? publicvoid setValueString(String? valueString)
          ? ? {
          ? ? ? ? this.valueString = valueString;
          ? ? }
          }



          注:valueString并不映射到數(shù)據(jù)庫(kù)的CLOB字段,只是方便需要使用這個(gè)BO的人用GET、SET 處理這個(gè)巨長(zhǎng)的CLOB字段
          ------------
          xdocLet生成的XML文件:
          java代碼:?


          <?xml version="1.0"?>

          <!DOCTYPE hibernate-mapping PUBLIC
          ? ? "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
          ? ? "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

          <hibernate-mapping>
          ? ? <class
          ? ? ? ? name="com.idncn.mc.bo.SNCParameters"
          ? ? ? ? table="SNCParameters"
          ? ? ? ? dynamic-update="false"
          ? ? ? ? dynamic-insert="false"
          ? ? >

          ? ? ? ? <id
          ? ? ? ? ? ? name="id"
          ? ? ? ? ? ? column="id"
          ? ? ? ? ? ? type="long"
          ? ? ? ? ? ? unsaved-value="null"
          ? ? ? ? >
          ? ? ? ? ? ? <generator class="native">
          ? ? ? ? ? ? </generator>
          ? ? ? ? </id>

          ? ? ? ? <property
          ? ? ? ? ? ? name="name"
          ? ? ? ? ? ? type="string"
          ? ? ? ? ? ? update="true"
          ? ? ? ? ? ? insert="true"
          ? ? ? ? ? ? column="name"
          ? ? ? ? ? ? not-null="true"
          ? ? ? ? ? ? unique="false"
          ? ? ? ? />

          ? ? ? ? <property
          ? ? ? ? ? ? name="sncId"
          ? ? ? ? ? ? type="long"
          ? ? ? ? ? ? update="true"
          ? ? ? ? ? ? insert="true"
          ? ? ? ? ? ? column="sncId"
          ? ? ? ? ? ? not-null="true"
          ? ? ? ? ? ? unique="false"
          ? ? ? ? />

          ? ? ? ? <property
          ? ? ? ? ? ? name="value"
          ? ? ? ? ? ? type="clob"
          ? ? ? ? ? ? update="true"
          ? ? ? ? ? ? insert="true"
          ? ? ? ? ? ? column="value"
          ? ? ? ? ? ? not-null="true"
          ? ? ? ? ? ? unique="false"
          ? ? ? ? />
          ? ? </class>

          </hibernate-mapping>


          --------------------
          insert的代碼:
          java代碼:?


          ? ? publicList batchAddSncParameters(List sncParametersList, Long sncId)throws DbAccessException
          ? ? {
          ? ? ? ? logger.enterMethod();
          ? ? ? ? List ret = newArrayList();
          ? ? ? ? try
          ? ? ? ? {
          ? ? ? ? ? ? sess = getSession();
          ? ? ? ? ? ? if(sncParametersList != null && sncParametersList.size() > 0)
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? for(int i = 0; i < sncParametersList.size(); i++)
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? SNCParameters cp = (SNCParameters) sncParametersList.get(i);
          ? ? ? ? ? ? ? ? ? ? long newId = -1;
          ? ? ? ? ? ? ? ? ? ? if(cp != null)
          ? ? ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? ? ? SNCParameters cpNew = new SNCParameters();
          ? ? ? ? ? ? ? ? ? ? ? ? cpNew.setSncId(sncId);
          ? ? ? ? ? ? ? ? ? ? ? ? cpNew.setName(cp.getName());
          ? ? ? ? ? ? ? ? ? ? ? ? cpNew.setValue(Hibernate.createClob(" "));
          ? ? ? ? ? ? ? ? ? ? ? ? newId = ((Long) sess.save(cpNew)).longValue();
          ? ? ? ? ? ? ? ? ? ? ? ? sess.flush();

          ? ? ? ? ? ? ? ? ? ? ? ? sess.refresh(cpNew, LockMode.UPGRADE);
          ? ? ? ? ? ? ? ? ? ? ? ? String content = cp.getValueString();

          ? ? ? ? ? ? ? ? ? ? ? ? String appserver = System.getProperty("appserver", "jboss");
          ? ? ? ? ? ? ? ? ? ? ? ? if(!appserver.equalsIgnoreCase("jboss"))
          ? ? ? ? ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? //weblogic
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? OracleThinClob clob = (OracleThinClob) cpNew.getValue();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? java.io.Writer pw = clob.getCharacterOutputStream();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? pw.write(content);
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? pw.flush();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? pw.close();
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? else
          ? ? ? ? ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? //jboss
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? oracle.sql.CLOB clob = (oracle.sql.CLOB) cpNew.getValue();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? java.io.Writer pw = clob.getCharacterOutputStream();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? pw.write(content);
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? pw.flush();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? pw.close();
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ret.add(newLong(newId));
          ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? }
          ? ? ? ? }
          ? ? ? ? catch(Exception e)
          ? ? ? ? {
          ? ? ? ? ? ? logger.error(e);
          ? ? ? ? ? ? ErrorReason errorReason = new ErrorReason(ErrorReason.INSERT_OBJECT_FAILED_REASON);
          ? ? ? ? ? ? throw new DbAccessException(DbAccessException.DBA_OPERATE_EXCEPTION, errorReason);
          ? ? ? ? }
          ? ? ? ? finally
          ? ? ? ? {
          ? ? ? ? ? ? closeSession(sess);
          ? ? ? ? ? ? logger.exitMethod();
          ? ? ? ? }
          ? ? ? ? return ret;
          ? ? }


          -----------------
          注:Weblogic必須使用weblogic.jdbc.vendor.oracle.OracleThinClob
          ---------------------
          讀取CLOB字段:
          java代碼:?


          ? ? publicList selectSncParametersBySncId(long sncId)throws DbAccessException
          ? ? {
          ? ? ? ? logger.enterMethod();
          ? ? ? ? List ret = newArrayList();
          ? ? ? ? try
          ? ? ? ? {
          ? ? ? ? ? ? sess = getSession();
          ? ? ? ? ? ? String query = "select cp from cp in class com.idncn.mc.bo.SNCParameters where cp.sncId = ?";
          ? ? ? ? ? ? logger.debug("SQL=" + query);
          ? ? ? ? ? ? List iter = sess.find(query, newLong(sncId), Hibernate.LONG);
          ? ? ? ? ? ? for(int i = 0; i < iter.size(); i++)
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? SNCParameters newCp = new SNCParameters();
          ? ? ? ? ? ? ? ? SNCParameters cp = (SNCParameters)(iter.get(i));
          ? ? ? ? ? ? ? ? logger.debug("after fetch:" + cp);
          ? ? ? ? ? ? ? ? newCp.setId(cp.getId());
          ? ? ? ? ? ? ? ? newCp.setSncId(cp.getSncId());
          ? ? ? ? ? ? ? ? newCp.setName(cp.getName());
          ? ? ? ? ? ? ? ? java.sql.Clob clob = cp.getValue();
          ? ? ? ? ? ? ? ? if(clob != null)
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? logger.debug("b===" + clob.length());
          ? ? ? ? ? ? ? ? ? ? String b = clob.getSubString(1, (int) clob.length());
          ? ? ? ? ? ? ? ? ? ? //logger.debug("b==="+b);
          ? ? ? ? ? ? ? ? ? ? newCp.setValueString(b);
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ret.add(newCp);
          ? ? ? ? ? ? }
          ? ? ? ? }
          ? ? ? ? catch(Exception e)
          ? ? ? ? {
          ? ? ? ? ? ? logger.error(e);
          ? ? ? ? ? ? ErrorReason errorReason = new ErrorReason(ErrorReason.SELECT_FAILED_REASON);
          ? ? ? ? ? ? throw new DbAccessException(DbAccessException.DBA_OPERATE_EXCEPTION, errorReason);
          ? ? ? ? }
          ? ? ? ? finally
          ? ? ? ? {
          ? ? ? ? ? ? closeSession(sess);
          ? ? ? ? ? ? logger.exitMethod();
          ? ? ? ? }
          ? ? ? ? return ret;
          ? ? }


          ---------------
          更新這個(gè)字段的代碼:
          java代碼:?


          ? ? publicvoid updateSncParameters(SNCParameters newParam)throws DbAccessException
          ? ? {
          ? ? ? ? logger.enterMethod();
          ? ? ? ? try
          ? ? ? ? {
          ? ? ? ? ? ? sess = getSession();

          ? ? ? ? ? ? Long id = newParam.getId();
          ? ? ? ? ? ? SNCParameters pp = (SNCParameters) sess.load(SNCParameters.class, id, net.sf.hibernate.LockMode.UPGRADE);

          ? ? ? ? ? ? pp.setSncId(newParam.getSncId());
          ? ? ? ? ? ? pp.setName(newParam.getName());
          ? ? ? ? ? ? pp.setId(newParam.getId());

          ? ? ? ? ? ? String newValue = newParam.getValueString();
          ? ? ? ? ? ? logger.debug("Update Length =" + newValue.length());

          ? ? ? ? ? ? String appserver = System.getProperty("appserver", "jboss");
          ? ? ? ? ? ? logger.debug("appserver: " + appserver);
          ? ? ? ? ? ? if(!appserver.equalsIgnoreCase("jboss"))
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? //weblogic
          ? ? ? ? ? ? ? ? OracleThinClob clob = (OracleThinClob) pp.getValue();
          ? ? ? ? ? ? ? ? if(pp != null)
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? java.io.Writer pw = clob.getCharacterOutputStream();
          ? ? ? ? ? ? ? ? ? ? pw.write(newValue);
          ? ? ? ? ? ? ? ? ? ? pw.flush();
          ? ? ? ? ? ? ? ? ? ? pw.close();
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? }
          ? ? ? ? ? ? else
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? //jboss
          ? ? ? ? ? ? ? ? oracle.sql.CLOB clob = (oracle.sql.CLOB) pp.getValue();
          ? ? ? ? ? ? ? ? if(pp != null)
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? java.io.Writer pw = clob.getCharacterOutputStream();
          ? ? ? ? ? ? ? ? ? ? pw.write(newValue);
          ? ? ? ? ? ? ? ? ? ? pw.flush();
          ? ? ? ? ? ? ? ? ? ? pw.close();
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? }
          ? ? ? ? }
          ? ? ? ? catch(Exception e)
          ? ? ? ? {
          ? ? ? ? ? ? logger.error(e);
          ? ? ? ? ? ? ErrorReason errorReason = new ErrorReason(ErrorReason.UPDATE_OBJECT_FAILED_REASON);
          ? ? ? ? ? ? throw new DbAccessException(DbAccessException.DBA_OPERATE_EXCEPTION, errorReason);
          ? ? ? ? }
          ? ? ? ? finally
          ? ? ? ? {
          ? ? ? ? ? ? closeSession(sess);
          ? ? ? ? ? ? logger.exitMethod();
          ? ? ? ? }
          ? ? }


          posted on 2006-07-11 11:07 船長(zhǎng) 閱讀(1802) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): J2EE
          主站蜘蛛池模板: 阿克陶县| 孝义市| 东乌珠穆沁旗| 德阳市| 新河县| 溧阳市| 宜黄县| 壤塘县| 平和县| 靖宇县| 奇台县| 青神县| 彰武县| 香格里拉县| 施甸县| 漳州市| 宜宾市| 兴安盟| 麻城市| 新野县| 横山县| 乌拉特前旗| 宁乡县| 盐边县| 永昌县| 迭部县| 铁岭市| 响水县| 望谟县| 纳雍县| 简阳市| 利川市| 白河县| 临潭县| 和田市| 清涧县| 苍梧县| 双峰县| 南雄市| 邵武市| 阳原县|