行大小太大(> 8126)Hibernate

时间:2017-03-15 13:45:27

标签: java mysql hibernate

我遇到了问题 - 我的行数太大(> 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,而不是它们的原始数据类型(其中一些仍然保持为他们的原始数据类型)。

这对于任何选择我的解决方案的人来说都是正确的。

3 个答案:

答案 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

那就是它。现在我可以插入所有列了,我不会再收到错误了。