报的错:
Reason=org.hibernate.exception.GenericJDBCException: could not insert: [com.test.entity.Fizdenhed]
ORA-12899: 列 "FI"."FIZDENHED"."LNNM" 的值太大 (实际值: 28, 最大值: 24)
-----------------------
Fizdenhed.hbm.xml定义的:
<property name="lnnm" type="string">
<column name="LNNM" length="24" not-null="true" />
</property>
-------------------------
FIZDENHED表里的LNNM字段也定义长度为24
-----------------------------------------------
就是在插入FIZDENHED表的时候出错.
但是很奇怪.
我在插入语句执行之前,用System.out.println(Fizdenhed.getLnnm().length());来显示准备插入LNNM字段的值的长度。
结果的确是24
不知道为什么会出来长度为28的?
12 个解决方案
再顶~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我查过了..是HIBERNATE取数据的时候就有问题了..
System.out.println(Fizdenhed.getLnnm().length虽然是24
但BYTE数的话就是28,因为里面有4个中文~
结果如下:
'012345678901234567890123'---参照
'哈哈哈哈 '--System.out
LNNM在ORACLE里定义的是CHAR型,所以长度不足24时,会补空SPACE
我试过其他字段,也是如此,比如CHAR(2)的字段,值为'美'
HIBERNATE里取到的就是'美 '
用show_sql为true..用显示的SELECT语句在SI OBJECT BROWSER执行,
结果是正确的'哈哈哈哈 '和'美',并没有多加SPACE
是不是HIBERNATE哪里设置有问题?
'哈哈哈哈 '--System.out
是比'012345678901234567890123'多四个空SPACE,
这不是HIBERNATE取数据的问题,DB中的大小是24byte,你往里存当然不能超过24byte。
虽然你的字符串长度是24,可以一个汉字是2个字节(你目前的编码下),如果你这28byte能成功存进最大为24byte的字段,Hibernate才是出鬼了。
建议你在页面(不知道你是不是Web开发)限制输入的最大字节数,不能超过24byte。
还有,你的长度不足24补空格我想是因为你数据库的该字段用的是char(24),如果用varchar2(24)不会有这个情况。
先谢谢楼上滴回帖~
不过,我知道原因是出在这值是从另一张表里取到后,后加空格后才出现的问题。
现在的问题是为什么取数值的时候会在取到空格会多~(数据库里该表也是CHAR(24))
用show_sql为true打出的SELECT在SI OBJECT BROWSER运行时,这字符串是4个中文+16个空格,(此应该为正解)
但在程序里实际取到的却是4个中文+20个空格。(多了4个空格)
感觉现在HIBERNATE一直在以字符数计算汉字?算的是LENGTH的长度
取的时候,它一定把4个中文的单个长度看成1,才会在后面+20个空格的吧。。好奇怪啊~~
我不希望改动数据类型~