环境oracle9i hibernate3 weblogic ojdbc14
映射文件我写成java.lang.string 保存大于32K的字节,就会出现无故丢失字符,还不可重现。应该可以重现啊。谁给解释下

解决方案 »

  1.   

    呵呵,这个问题我也碰到过。一般来说如果字符串长度在1000~2000之间时,Oracle会将字符串视为Long型数据所以,如果字符串长度1000~2000之间时,给字符串追加空格就OK了LZ试试看
      

  2.   

    jacky68147527 不知道说的对不对,
    你的数据库是生成的还是自己创建的, 如果是自己创建的话你看看数据库里的type 是不是也是char 或者 varchar类型的.
      

  3.   


    字符在1000-2000字符到没有问题
    字符以大于32K就会出现存储无故丢失,当然换成Clob类型就没有错误
      

  4.   

    数据库采用CLOB类型,映射为text就行了
    映射为text类型的数据是作为流提交的
      

  5.   

    你把showsql打开,看看sql输出就清楚了
    映射为string的话,字段的值是直接作为字符串内容在sql中出现的,但是sql中单个字段长度不能超过4000b
      

  6.   

    registerHibernateType(Types.LONGVARCHAR,Hibernate.TEXT.getName());
      

  7.   

    这种方法是不是注册一下hibernate没有的类型
      

  8.   

    看看你数据库那个字段的数据类型是什么,varchar好像存不了那么多内容,用text
      

  9.   

    楼主做论坛吗? 那么大得多少字啊! 为啥不用CLOB?
      

  10.   

    我在Oracle中也碰到这样的问题,个人觉得是Oracle驱动方面的Bug解决方法是将该字段类型映射成chdw.StringClobType extends org.hibernate.type.StringClobType建立一个临时表emptyclobtable(cclob CLOB),在nullSafeSet方法里面先delete from emptyclobtable
    再insert into emptyclobtable values(empty_clob())
    再select cclob from emptyclobtable
    得到CLOB clob 后再调用 clob.getCharacterOutputStream().write(str);再调用stat.setClob(i, clob);这样设置CLOB
    这样在外面代码中是不会看到Clob的存在,还是String操作。