hibernate往表里插数据的时候出错


报的错:
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 个解决方案

#1


该回复于2015-05-26 13:23:22被管理员删除

#2


虽然你的结贴率为0,但我还是帮你顶了。
mark

#3


有人知道么?
顶上来~

#4


再顶~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#5


System.out.println(Fizdenhed.getLnnm().length());
换成。size()看看是多少?

#6


还有,把你的插入写法发上来,发的全点。。。。

#7


我查过了..是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哪里设置有问题?

#8


'哈哈哈哈                      '--System.out         
是比'012345678901234567890123'多四个空SPACE,

#9


顶上来

#10


这不是HIBERNATE取数据的问题,DB中的大小是24byte,你往里存当然不能超过24byte。
虽然你的字符串长度是24,可以一个汉字是2个字节(你目前的编码下),如果你这28byte能成功存进最大为24byte的字段,Hibernate才是出鬼了。

建议你在页面(不知道你是不是Web开发)限制输入的最大字节数,不能超过24byte。

还有,你的长度不足24补空格我想是因为你数据库的该字段用的是char(24),如果用varchar2(24)不会有这个情况。

#11


先谢谢楼上滴回帖~
不过,我知道原因是出在这值是从另一张表里取到后,后加空格后才出现的问题。
现在的问题是为什么取数值的时候会在取到空格会多~(数据库里该表也是CHAR(24))
用show_sql为true打出的SELECT在SI OBJECT BROWSER运行时,这字符串是4个中文+16个空格,(此应该为正解)
但在程序里实际取到的却是4个中文+20个空格。(多了4个空格)

感觉现在HIBERNATE一直在以字符数计算汉字?算的是LENGTH的长度
取的时候,它一定把4个中文的单个长度看成1,才会在后面+20个空格的吧。。好奇怪啊~~

我不希望改动数据类型~

#12


该回复于2008-07-04 09:34:41被版主删除

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号