網上有非常多的例子,不過這部分也是難點,可能一不小心就會出錯。下面會列出幾個容易出錯的地方。有時候可能會因爲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;
}
}