首页 > 开发 > 综合 > 正文

利用Hibernate Synchronizer插入oralce.CLOB字段

2024-07-21 02:40:10
字体:
来源:转载
供稿:网友
表info的映射文件info.xml为:<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" ><hibernate-mapping>
 <class name="src.Info" table="INFO">
  <id
   column="INFO_ID"
   name="Id"
   type="integer"
  >
   <generator class="vm">
                <!--param name="INFO">info_id</param-->
                <!--param name="INFO_ID">next_hi_value_column</param-->
         </generator>  </id>
  <PRoperty
   column="INFO_CONT"
   name="InfoCont"
   not-null="false"
   type="java.sql.Clob"
   />
  <property
   column="INFO_AREA"
   length="100"
   name="InfoArea"
   not-null="false"
   type="string"
   />
  <property
   column="INFO_DATE"
   length="7"
   name="InfoDate"
   not-null="false"
   type="date"
   />
 </class>
</hibernate-mapping>
其中红色字体为要映射的Oracle.CLOB类型。(在这里将其类型定义为java.sql.Clob类型,假如定义为oracle.CLOB,在运行时,会抛出异常net.sf.hibernate.MappingException: Error reading resource: Info.hbmnet.sf.hibernate.MappingException: Error reading resource: Info.hbm。我也不明白为什么,估计是找不到包,假如那位知道,请告诉我!)下面是相应的代码片断:        // Load the configuration file
        _RootDAO.initialize();
               
        // Create a instance of Info represents a new info to be added
        Info newInfo = new Info(new Integer(id));
        newInfo.setInfoArea(infoArea);
        newInfo.setInfoDate(Calendar.getInstance().getTime());
        InfoDAO infoDao = new InfoDAO();        session s = _RootDAO.createSession();
        Transaction tx = s.beginTransaction();
                // Insert a empty value into info_cont first
        newInfo.setInfoCont(Hibernate.createClob(" ") );
        s.save(newInfo);
        s.flush();        // Lock the relative row
        s.refresh(newInfo, LockMode.UPGRADE);
        CLOB clob = (CLOB) newInfo.getInfoCont();
        java.io.Writer pw = clob.getCharacterOutputStream();
        try {
            pw.write(infoCont);// Write the CLOB value into table
            pw.close();
        } catch(IOException e) {
            throw new HibernateException(e);
        }
       
        tx.commit();
        s.close();不过这个方法是最笨的一个办法,更好的办法,或者说更透明的方法是通过实现net.sf.hibernate.UserType接口,来自定义处理oracle.CLOB类型的类。这种方法仍然在研究中:)。虽然说这个方法比较落后,但是,最起码现在可以通过hibernate插入oracle.CLOB字段了!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表