你用oracle里的ojdbc.jar应该就可以了.不要用服务器自带的,会有问题的.

解决方案 »

  1.   

    然后oracle的Clob字段读写与其它的数据库不同,因为对于Oracle来说,Clob,Blob等字段本身有一个cursor,必须使用Cursor来进行读写操作,因此在你操作Clob字段之前,必须获得他相应的Cursor,但是数据还没有插入,相应的cursor没有怎么办?有办法,那就是先插入一个空的数据然后返回它的cursor,然后再使用update操作更新它的数据即可!首先在你的hbm配置文件中
    <property name="workSum" column="WORK_SUM" type="java.sql.Clob" />
    去掉type="java.sql.Clob",变成<property name="workSum" column="WORK_SUM">然后你的代码这样写
    s = sf.openSession();
    tx = s.beginTransaction();hs = new HS();
    hs.setWorkSum(Hibernate.createClob("    "));
    s.save(hs);
    s.flush();
    s.refresh(hs, LockMode.UPGRADE); //关键是这里oracle.sql.CLOB clob = (oracle.sql.CLOB) hs.getWorkSum();
    java.io.Writer pw = clob.getCharacterOutputStream();
    pw.write(content);
    pw.close();
    tx.commit();
    s.close();
      

  2.   

    不过还有一个办法,那就是把Clob类型影射成String类型,这样就可以直接操作,免去上面的烦琐步骤package mypackage;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Types;
    import java.sql.Clob;import cirrus.hibernate.Hibernate;
    import cirrus.hibernate.HibernateException;
    import cirrus.hibernate.UserType;public class StringClobType implements UserType
    {
        public int[] sqlTypes()
        {
            return new int[] { Types.CLOB };
        }    public Class returnedClass()
        {
            return String.class;
        }    public boolean equals(Object x, Object y)
        {
            return (x == y)
                || (x != null
                    && y != null
                    && (x.equals(y)));
        }    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
            throws HibernateException, SQLException
        {
            Clob clob = rs.getClob(names[0]);
            return clob.getSubString(1, (int) clob.length());
        }    public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException
        {
            st.setClob(index, Hibernate.createClob((String) value));
        }    public Object deepCopy(Object value)
        {
            if (value == null) return null;
            return new String((String) value);
        }    public boolean isMutable()
        {
            return false;
        }
    }
    然后修改你的hbm配置文件中的类型,使它的类型使用你自己定义的类型<property name="workSum" column="WORK_SUM" type="mypackage.StringClobType"/>
    然后你就可以在你的持久类中把workSum的类型直接改成String使用了!
      

  3.   

    如果采用上一种方式的话要用到Session工厂,而我本身没有hibernate.hbm.xml这个文件所以用那种方式可能不可行;如果采用下面一种方式的话.我在存取过程中是否都可以和一般的一样操作.不要去转换类型
      

  4.   

    如果定义成下面这种..那我的Action层还要做什么样的处理呢.能插入多少呢..
      

  5.   

    不行啊.会报java.lang.ClassCastException这个错啊.