关于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 ( );
        }
    }


57616.html

船长 2006-07-11 11:07 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值