hibernate 写数据库时发生异常“ORACLE:数据大小超出此类型的最大值: 1024”
在 oracle 9i上有这个问题 ,在oracle10g上就没有这个问题了。两个版本在这项限制上有区别吗?表中有两个字段定义为 varchar2(4000),存放的是固定长度为1024的字符串。java.sql.SQLException: ORACLEata size bigger than max size for this type: 1024
        at org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter.reFactorException(OracleExceptionSorter.java:54)
        at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.refactorException(LocalManagedConnectionFactory.java:842)
        at org.jboss.resource.adapter.jdbc.local.LocalManagedConnection.refactorException(LocalManagedConnection.java:672)
        at org.jboss.resource.adapter.jdbc.local.LocalConnection.checkException(LocalConnection.java:919)
        at org.jboss.resource.adapter.jdbc.local.LocalStatement.checkException(LocalStatement.java:780)
        at org.jboss.resource.adapter.jdbc.local.LocalPreparedStatement.setString(LocalPreparedStatement.java:410)
        at org.hibernate.type.StringType.set(StringType.java:26)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:131)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:108)
        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2248)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
中文环境下报错是  Caused by: java.sql.SQLException: ORACLE:数据大小超出此类型的最大值: 1024;
网上有些资料表明是jdbc驱动的问题,但是我换了oracle 10.2.0.2 的驱动 文件Ojdbc14.jar(1.46 MB (1,540,457 字节)) 的也是无济于事,感觉还是数据库版本不同会有差别,oracle10就没有这个问题 。

解决方案 »

  1.   

    我存放的是16进制的字符串,不存在中英文的问题。varchar2 最大长度为 4000,我这边固定为1024 远没有超过范围。
      

  2.   

    将这个字段设置为COLB类型(大文本),如果是二进制流的话可以设置为BOLB类型
    或者就是将该字段宽度在扩大
      

  3.   

    是不是你Hibernate的Domain类配置这个字段的时候,设置的小了?LZ去看看Domain类配置中这个属性的大小吧
      

  4.   

    这个要看oracle的字符集,oracle把一个中文当成4个字节,当然就只能是1000个中文。
      

  5.   


    我的运行环境中没有classes12.jar,只有Ojbdc14.jar.
    我试了以下几种方案都无效:
    1、我删除 ojdbc14.jar ,增加classes12.jar。
    2、ojdbc14.jar,classes12.jar 共存。我分析还是数据库的问题,因为一样的驱动,链接oracle10g时没有问题,链接 oracle9i 就有问题。
      

  6.   

    oracle9i 是 采用字符集为 ZHS32GB18030,oracle10g用的是 ZHS16GBK,在oracle9i上重新创建一个实例,指定字符集为ZHS16GBK后,症状消失了。
    具体原因不详。我存储的是 16进制字符串,也就是说都是数字和英文字母,长度固定为1024,字段定义成varchar2(4000),无论如何也不会超过限制 。
      

  7.   

    好像就是字符集的问题,ZHS32GB18030是32位字符集,ZHS16GBK是8位字符集.这个应该是楼主遇到的问题的原因吧
      

  8.   

    我查到的资料是 ZHS32GB18030相对于储存汉字更有优势,因为它是32位的字符集,这样对于英文和数字来说,比起8位的ZHS16GBK字符集,应该同样的字幕,大小大4倍吧.
    不知道我这样的理解对不对