我遇到了问题 - 我的行数太大(> 8126)。“尝试使用Hibernate创建数据库表时出错(我在“create”上使用hibernate.hbm2ddl.auto属性来执行此操作)。
问题是我有几列应该是TEXT,而不是VARCHAR。显然,这些列上的行太大,我得到上述错误。
我配置Hibernate的方式是使用映射文件。
以下是其中一个映射属性的外观:
<property name="transmission_current_range" type="java.lang.String" length="65535">
<column name="TRANSMISSION_CURRENT_RANGE"/>
</property>
注意我将长度设置为65535,希望这能解决我的问题,但事实并非如此。
你怎么告诉Hibernate你希望这个列是TEXT而不是VARCHAR?我已经看过使用注释的示例,但我想使用我的映射文件来做同样的事情。
另外,TEXT对应的java类型是什么?我搜索了这个,但我发现只有java.lang.String,它与用于VARCHAR和TEXT的数据类型相同,所以它没有用。
编辑:显然,这个问题不是因为我需要将数据更改为“TEXT”而不是“String”,但因为我有这么多列,每行(行)超过了8126的限制。
我现在收到此错误:
“行大小太大。使用的表类型的最大行大小(不包括BLOB)是8126.这包括存储开销,请查看手册。您必须将某些列更改为TEXT或BLOB “
EDIT2:显然,这个错误的原因是我有这么多列,行长度太大了。所以这不是TEXT而不是VARCHAR 本身的问题,而是根据列长度我只是有太多的“数据”。
更改mysql cfg文件中的innodb_strict_mode = 0
解决了这个问题,但是当我让Hibernate再次自动创建数据库时,创建的列是BLOB,而不是它们的原始数据类型(其中一些仍然保持为他们的原始数据类型)。
这对于任何选择我的解决方案的人来说都是正确的。
答案 0 :(得分:0)
使用text
代替java.lang.String
:
<property name="transmission_current_range"
type="text" length="65535">
<column name="TRANSMISSION_CURRENT_RANGE"/>
</property>
答案 1 :(得分:0)
Hibernate文档提到了sql-type
元素的<column>
。您可以尝试:
<column name="TRANSMISSION_CURRENT_RANGE" sql-type="text"/>
答案 2 :(得分:0)
好的,我已经设法解决了我的问题。解决方案是这一行,插入&#34; /etc/mysql/my.cnf"文件,在[mysqld]类别中:
innodb_strict_mode = 0
那就是它。现在我可以插入所有列了,我不会再收到错误了。