网上有非常多的例子,不过这部分也是难点,可能一不小心就会出错。下面会列出几个容易出错的地方。有时候可能会因为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;
}
}