在网上闲逛找到了解决方案:
现在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
-------------
数据库结构:
--------------
BO采用xdoclet建立的:
注:valueString并不映射到数据库的CLOB字段,只是方便需要使用这个BO的人用GET、SET 处理这个巨长的CLOB字段
------------
xdocLet生成的XML文件:
--------------------
insert的代码:
-----------------
注:Weblogic必须使用weblogic.jdbc.vendor.oracle.OracleThinClob
---------------------
读取CLOB字段:
---------------
更新这个字段的代码:
现在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 (<span style="COLOR: #000000" ?="">19 ) NOT <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">NULL, SNCID NUMBER (<span style="COLOR: #000000" ?="">19 ), NAME VARCHAR2 (<span style="COLOR: #000000" ?="">255 ), VALUE CLOB ) |
--------------
BO采用xdoclet建立的:
java代码: |
<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">class SNCParameters <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">extends BaseObject { /** * Returns the id. * * @return long * @hibernate.id * column = "id" * type = "long" * generator-class = "native" * unsaved-value = "null" */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">Long getId ( ) { <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return id; } /** * Sets the Id attribute of the SNCParameters object * * @param id The new Id value */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">void setId (<span style="COLOR: #aaaadd" ?="">Long id ) { this. id = id; } /** * Returns the name. * * @return String * * @hibernate.property * column = "name" * type = "string" * not-null = "true" * unique = "false" */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">String getName ( ) { <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return name; } /** * Sets the Name attribute of the SNCParameters object * * @param name The new Name value */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">void setName (<span style="COLOR: #aaaadd" ?="">String name ) { this. name = name; } /** * Returns the sncId. * * @return Long * * @hibernate.property * column = "sncId" * type = "long" * not-null = "true" * unique = "false" */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">Long getSncId ( ) { <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return sncId; } /** * Sets the SncId attribute of the SNCParameters object * * @param sncId The new SncId value */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">void setSncId (<span style="COLOR: #aaaadd" ?="">Long sncId ) { this. sncId = sncId; } /** * Returns the values. * * @return Clob * * @hibernate.property * column = "value" * type = "clob" * not-null = "true" * unique = "false" */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">Clob getValue ( ) { <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return value; } /** * Sets the Values attribute of the SNCParameters object * * @param values The new Values value */ <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">void setValue (<span style="COLOR: #aaaadd" ?="">Clob value ) { this. value = value; } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">private<span style="COLOR: #aaaadd" ?="">Long id; <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">private<span style="COLOR: #aaaadd" ?="">Long sncId; <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">private<span style="COLOR: #aaaadd" ?="">String name; <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">private<span style="COLOR: #aaaadd" ?="">Clob value; <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">private<span style="COLOR: #aaaadd" ?="">String valueString; <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">String getValueString ( ) { <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return valueString; } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">void setValueString (<span style="COLOR: #aaaadd" ?="">String valueString ) { this. valueString = valueString; } } |
注:valueString并不映射到数据库的CLOB字段,只是方便需要使用这个BO的人用GET、SET 处理这个巨长的CLOB字段
------------
xdocLet生成的XML文件:
java代码: |
<?xml version="<span style="COLOR: #000000" ?="">1.<span style="COLOR: #000000" ?="">0"?> <!DOCTYPE hibernate-mapping <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">PUBLIC "- //Hibernate/Hibernate Mapping DTD 2.0//EN" "http: //hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">class name="com. idncn. mc. bo. SNCParameters" table="SNCParameters" dynamic-update="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">false" dynamic-insert="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">false" > <id name="id" column="id" type="long" unsaved-value="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null" > <generator <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">class="native"> </generator> </id> <property name="name" type="string" update="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" insert="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" column="name" not-<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" unique="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">false" /> <property name="sncId" type="long" update="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" insert="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" column="sncId" not-<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" unique="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">false" /> <property name="value" type="clob" update="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" insert="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" column="value" not-<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">true" unique="<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">false" /> </<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">class> </hibernate-mapping> |
--------------------
insert的代码:
java代码: |
<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">List batchAddSncParameters (<span style="COLOR: #aaaadd" ?="">List sncParametersList, <span style="COLOR: #aaaadd" ?="">Long sncId )<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">throws DbAccessException { logger. enterMethod ( ); <span style="COLOR: #aaaadd" ?="">List ret = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new<span style="COLOR: #aaaadd" ?="">ArrayList ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">try { sess = getSession ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (sncParametersList != <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null && sncParametersList. size ( ) > <span style="COLOR: #000000" ?="">0 ) { <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">for (<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">int i = <span style="COLOR: #000000" ?="">0; i < sncParametersList. size ( ); i++ ) { SNCParameters cp = (SNCParameters ) sncParametersList. get (i ); long newId = -<span style="COLOR: #000000" ?="">1; <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (cp != <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null ) { SNCParameters cpNew = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new SNCParameters ( ); cpNew. setSncId (sncId ); cpNew. setName (cp. getName ( ) ); cpNew. setValue (Hibernate. createClob (" " ) ); newId = ( (<span style="COLOR: #aaaadd" ?="">Long ) sess. save (cpNew ) ). longValue ( ); sess. flush ( ); sess. refresh (cpNew, LockMode. UPGRADE ); <span style="COLOR: #aaaadd" ?="">String content = cp. getValueString ( ); <span style="COLOR: #aaaadd" ?="">String appserver = <span style="COLOR: #aaaadd" ?="">System. getProperty ("appserver", "jboss" ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (!appserver. equalsIgnoreCase ("jboss" ) ) { //weblogic OracleThinClob clob = (OracleThinClob ) cpNew. getValue ( ); java. io. Writer pw = clob. getCharacterOutputStream ( ); pw. write (content ); pw. flush ( ); pw. close ( ); } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">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 (<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new<span style="COLOR: #aaaadd" ?="">Long (newId ) ); } } } } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">catch (<span style="COLOR: #aaaadd" ?="">Exception e ) { logger. error (e ); ErrorReason errorReason = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new ErrorReason (ErrorReason. INSERT_OBJECT_FAILED_REASON ); throw <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new DbAccessException (DbAccessException. DBA_OPERATE_EXCEPTION, errorReason ); } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">finally { closeSession (sess ); logger. exitMethod ( ); } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return ret; } |
-----------------
注:Weblogic必须使用weblogic.jdbc.vendor.oracle.OracleThinClob
---------------------
读取CLOB字段:
java代码: |
<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="COLOR: #aaaadd" ?="">List selectSncParametersBySncId (long sncId )<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">throws DbAccessException { logger. enterMethod ( ); <span style="COLOR: #aaaadd" ?="">List ret = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new<span style="COLOR: #aaaadd" ?="">ArrayList ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">try { sess = getSession ( ); <span style="COLOR: #aaaadd" ?="">String query = "select cp from cp in <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">class com. idncn. mc. bo. SNCParameters where cp. sncId = ?"; logger. debug ("SQL=" + query ); <span style="COLOR: #aaaadd" ?="">List iter = sess. find (query, <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new<span style="COLOR: #aaaadd" ?="">Long (sncId ), Hibernate. LONG ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">for (<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">int i = <span style="COLOR: #000000" ?="">0; i < iter. size ( ); i++ ) { SNCParameters newCp = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">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 ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (clob != <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null ) { logger. debug ("b===" + clob. length ( ) ); <span style="COLOR: #aaaadd" ?="">String b = clob. getSubString (<span style="COLOR: #000000" ?="">1, (<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">int ) clob. length ( ) ); //logger.debug("b==="+b); newCp. setValueString (b ); } ret. add (newCp ); } } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">catch (<span style="COLOR: #aaaadd" ?="">Exception e ) { logger. error (e ); ErrorReason errorReason = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new ErrorReason (ErrorReason. SELECT_FAILED_REASON ); throw <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new DbAccessException (DbAccessException. DBA_OPERATE_EXCEPTION, errorReason ); } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">finally { closeSession (sess ); logger. exitMethod ( ); } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">return ret; } |
---------------
更新这个字段的代码:
java代码: |
<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">public<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">void updateSncParameters (SNCParameters newParam )<span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">throws DbAccessException { logger. enterMethod ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">try { sess = getSession ( ); <span style="COLOR: #aaaadd" ?="">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 ( ) ); <span style="COLOR: #aaaadd" ?="">String newValue = newParam. getValueString ( ); logger. debug ("Update Length =" + newValue. length ( ) ); <span style="COLOR: #aaaadd" ?="">String appserver = <span style="COLOR: #aaaadd" ?="">System. getProperty ("appserver", "jboss" ); logger. debug ("appserver: " + appserver ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (!appserver. equalsIgnoreCase ("jboss" ) ) { //weblogic OracleThinClob clob = (OracleThinClob ) pp. getValue ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (pp != <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null ) { java. io. Writer pw = clob. getCharacterOutputStream ( ); pw. write (newValue ); pw. flush ( ); pw. close ( ); } } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">else { //jboss oracle. sql. CLOB clob = (oracle. sql. CLOB ) pp. getValue ( ); <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">if (pp != <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">null ) { java. io. Writer pw = clob. getCharacterOutputStream ( ); pw. write (newValue ); pw. flush ( ); pw. close ( ); } } } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">catch (<span style="COLOR: #aaaadd" ?="">Exception e ) { logger. error (e ); ErrorReason errorReason = <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new ErrorReason (ErrorReason. UPDATE_OBJECT_FAILED_REASON ); throw <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">new DbAccessException (DbAccessException. DBA_OPERATE_EXCEPTION, errorReason ); } <span style="FONT-WEIGHT: bold; COLOR: #990066" ?="">finally { closeSession (sess ); logger. exitMethod ( ); } } |