關於Hiberante存儲CLOB的一些心得體會

網上有非常多的例子,不過這部分也是難點,可能一不小心就會出錯。下面會列出幾個容易出錯的地方。有時候可能會因爲oracle版本的不同,會有很多異常,先寫下我的環境吧

MY ECLIPSE oracle9i 驅動可以是ojdbc14 9i11jdbcdrive 10g hibernate是3.0的 不過現在聽說oracle 10g的數據庫 10g的驅動可以直接在clob和String之間映射,這個沒有驗證。

hibernate的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.starit.bean.BackupQueue" table="message"
     catalog="esb">
     <id name="id" type="java.lang.Integer">
      <column name="Id" />
      <generator class="increment" />
     </id>
     <property name="ossFrom" type="java.lang.String">
      <column name="S_SYSTEM" />
     </property>
     <property name="ossTo" type="java.lang.String">
      <column name="R_SYSTEM" />
     </property>
     <property name="msgId" type="java.lang.String">
      <column name="msg_id" />
     </property>
     <property name="sendTime" type="java.lang.String">
      <column name="s_time" />
     </property>
     <property name="backupTime" type="java.util.Date">
      <column name="esb_savetime" length="19" />
     </property>
     <property name="sendDate" type="java.util.Date">
      <column name="S_DATE" length="19" />
     </property>
     <property name="contentXml" type="java.sql.Clob">//不知道爲何這部分必須用java.sql.Clob網上有人說用text也可以
      <column name="s_xml" />//可是我並沒有測試成功。
     </property>

   
     <property name="type" type="java.lang.String">
      <column name="type" />
     </property>
     <property name="esb_servicename" type="java.lang.String">
      <column name="esb_servicename" />
     </property>
     <property name="crm_code" type="java.lang.String">
      <column name="crm_code" />
     </property>
    </class>
</hibernate-mapping>
package com.starit.dao.impl;

import java.io.IOException;
import java.io.Writer;
import java.sql.Clob;
import java.sql.SQLException;

import oracle.sql.CLOB;

import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.lob.SerializableClob;

import com.starit.bean.BackupQueue;
import com.starit.dao.BackupQueuePersistentDAO;
import com.starit.dao.HibernateSessionFactory;
/**
 *
 * @author guolimin
 *
 */
public class BackupQueuePersistentDAOImpl implements BackupQueuePersistentDAO{ 
 private static Logger logger = Logger.getLogger(BackupQueuePersistentDAOImpl.class);
 
 private static SessionFactory factory = HibernateSessionFactory.getSessionFactory();
    /**
     * 保存esb的信息
     */
    public BackupQueue creat(String str,BackupQueue bq) {
     Session session = null;
     Writer pw = null;
        try {
         session = HibernateSessionFactory.getSession();
         Transaction t = session.beginTransaction();
         bq.setContentXml(Hibernate.createClob(" "));//插入空值中間是一個空格要注意不然下面會報NUlllException 這部分還有一種10G的寫法 CLOB.getEmptyCLOB() 也可以,不過ojdbc14數據庫舉動就不行
         session.save(bq);
         session.flush(); 
         session.refresh(bq,LockMode.UPGRADE);//重新update
         SerializableClob sc=(SerializableClob)bq.getContentXml();//這部分很重要 必須要 網上也有說不要的 可我沒有測試成功這部分功能是轉化成可以序列話
         Clob wrapclob=sc.getWrappedClob();
         CLOB clob = (CLOB)wrapclob; //這部非必須強制轉換成數據庫的CLOB類型,因爲他可以獲得流進行寫入 10g的話直接可以複製沒有這麼麻煩。  Clob clob = (Clob) bq.getContentXml();   clob.setString(1, str);就可以搞定。
         pw = clob.getCharacterOutputStream();
         pw.write(str);
         pw.flush();
         session.flush();
         session.save(bq);
         t.commit();   
        } catch (RuntimeException e) {
         logger.error(e);
         logger.error(bq.toString());
        }  catch (SQLException e) {
         logger.error(e);
         logger.error(bq.toString());
  } catch (IOException e) {
   logger.error(e);
   logger.error(bq.toString());
  }finally {
   if(pw!=null){try{pw.close();}catch(Exception e){}}
   if(session!=null){try{session.close();}catch(Exception e){}}
        }
  return bq;
    }
    /**
     *
     */
    public void delete(BackupQueue bq)  {
        try {
         Session session = HibernateSessionFactory.getSession();
         Transaction t = session.beginTransaction();
         session.delete(bq);
         t.commit();
        } catch (RuntimeException e) {
         logger.error(e);
   logger.error(bq.toString());
        } finally {
         HibernateSessionFactory.closeSession();
        }
    }

    public BackupQueue update(BackupQueue bq) {
        try {
   Session session = HibernateSessionFactory.getSession();
   Transaction t = session.beginTransaction();
   session.update(bq);
   t.commit();
  } catch (HibernateException e) {
   logger.error(e);
   logger.error(bq.toString());
  } finally {
   HibernateSessionFactory.closeSession();
  }
     return bq;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章