hibernate 写数据库时发生异常“ORACLE:数据大小超出此类型的最大值: 1024”

中国资深步行专家 2010-01-05 02:47:58
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就没有这个问题 。
...全文
579 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhujiuyiturael 的回复:]
我查到的资料是 ZHS32GB18030相对于储存汉字更有优势,因为它是32位的字符集,这样对于英文和数字来说,比起8位的ZHS16GBK字符集,应该同样的字幕,大小大4倍吧.
不知道我这样的理解对不对
[/Quote]


数字和英文也用4个字节来存储吗??疑惑中。。。

  • 打赏
  • 举报
回复
[Quote=引用 12 楼 crazylaa 的回复:]
换10g里面的class12.jar。
[/Quote]

我的运行环境中没有classes12.jar,只有Ojbdc14.jar.
我试了以下几种方案都无效:
1、我删除 ojdbc14.jar ,增加classes12.jar。
2、ojdbc14.jar,classes12.jar 共存。

我分析还是数据库的问题,因为一样的驱动,链接oracle10g时没有问题,链接 oracle9i 就有问题。
zhujiuyiturael 2010-01-06
  • 打赏
  • 举报
回复
我查到的资料是 ZHS32GB18030相对于储存汉字更有优势,因为它是32位的字符集,这样对于英文和数字来说,比起8位的ZHS16GBK字符集,应该同样的字幕,大小大4倍吧.
不知道我这样的理解对不对
zhujiuyiturael 2010-01-06
  • 打赏
  • 举报
回复
好像就是字符集的问题,ZHS32GB18030是32位字符集,ZHS16GBK是8位字符集.这个应该是楼主遇到的问题的原因吧
  • 打赏
  • 举报
回复
oracle9i 是 采用字符集为 ZHS32GB18030,oracle10g用的是 ZHS16GBK,在oracle9i上重新创建一个实例,指定字符集为ZHS16GBK后,症状消失了。
具体原因不详。我存储的是 16进制字符串,也就是说都是数字和英文字母,长度固定为1024,字段定义成varchar2(4000),无论如何也不会超过限制 。
crazylaa 2010-01-05
  • 打赏
  • 举报
回复
换10g里面的class12.jar。
  • 打赏
  • 举报
回复
大哥,我设置的字段长度是 4000
colin_pxx 2010-01-05
  • 打赏
  • 举报
回复
你固定1024么就是这里出了问题呀,实际存的字符串长度超过这个长度了
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fantasy2436 的回复:]
是不是你Hibernate的Domain类配置这个字段的时候,设置的小了?LZ去看看Domain类配置中这个属性的大小吧
[/Quote]

说具体一点,如何查看呢?
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 foolishdault 的回复:]
这个要看oracle的字符集,oracle把一个中文当成4个字节,当然就只能是1000个中文。
[/Quote]


不是中文,是十六进制字符串。
hchjjun 2010-01-05
  • 打赏
  • 举报
回复
shide
铁匠梁 2010-01-05
  • 打赏
  • 举报
回复
这个要看oracle的字符集,oracle把一个中文当成4个字节,当然就只能是1000个中文。
fantasy2436 2010-01-05
  • 打赏
  • 举报
回复
是不是你Hibernate的Domain类配置这个字段的时候,设置的小了?LZ去看看Domain类配置中这个属性的大小吧
maer56 2010-01-05
  • 打赏
  • 举报
回复
将这个字段设置为COLB类型(大文本),如果是二进制流的话可以设置为BOLB类型
或者就是将该字段宽度在扩大
  • 打赏
  • 举报
回复
我存放的是16进制的字符串,不存在中英文的问题。varchar2 最大长度为 4000,我这边固定为1024 远没有超过范围。
xql80329 2010-01-05
  • 打赏
  • 举报
回复
汉字和 字母 长度是不一样的
xql80329 2010-01-05
  • 打赏
  • 举报
回复
是因为 你有个字段能放的最大值不能超过1024. 在每种数据类型 都有最大值。具体查看数据类型的范围

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧