在網上閑逛找到了解決方案:
???? 現在3.x中對blob和clob增加了org.hibernate.lob.SerializableBlob和org.hibernate.lob.SerializableClob類的封裝。
其次如果你將前面的測試程序放到weblogic的容器中通過weblogic的數據源得到連接的話,你會發現oracle.sql.BLOB blob = (oracle.sql.BLOB)person.getImage();和 oracle.sql.CLOB clob = (oracle.sql.CLOB)person.getArticle();這倆行會出錯,原因就是weblogic進行了包裝。
現在將以上兩個問題的綜合解決方案用以下代碼說明:
????????????for (int i = 0; i < 10; i++) {
????????????????LargeObject large = new LargeObject();
????????????????large.setId(i + "");
????????????????large.setName("林意煒");
????????????????// 插入一個小數據數據
????????????????large.setImage(Hibernate.createBlob(new byte[1]));
????????????????large.setArticle(Hibernate.createClob(" "));
????????????????session.save(large);
????????????????session.flush();
????????????????// 鎖定該記錄
????????????????session.refresh(large, LockMode.UPGRADE);
????????????????// 插入圖片數據
????????????????String fileName = "E:/AAA/" + i + ".jpg";
????????????????SerializableBlob sb = (SerializableBlob)large.getImage();
????????????????java.sql.Blob wrapBlob = sb.getWrappedBlob();
????????????????// 通過非weblogic容器中數據源獲得連接的情況
????????????????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類型連接池,驅動類名: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();
????????????????}
????????????????// 插入文章數據
????????????????fileName = "E:/AAA/" + i + ".java";
????????????????SerializableClob cb = (SerializableClob)large.getArticle();
????????????????java.sql.Clob wrapClob = cb.getWrappedClob();
????????????????// 通過非weblogic容器中數據源獲得連接的情況
????????????????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類型連接池,驅動類名: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數據庫,Jboss或Weblogic。
JDBC采用ORACLE9i自帶的Class12.jar
-------------
數據庫結構:
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并不映射到數據庫的CLOB字段,只是方便需要使用這個BO的人用GET、SET 處理這個巨長的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; ? ? }
|
---------------
更新這個字段的代碼:
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
船長 閱讀(1802)
評論(0) 編輯 收藏 所屬分類:
J2EE