2017-03-15 38 views
1

我遇到问题 - 我得到“行大小太大(> 8126)”。当试图用Hibernate创建我的数据库表时出错(我在“create”上使用hibernate.hbm2ddl.auto属性来做到这一点)。行大小太大(> 8126)休眠

问题是我有几列应该是TEXT,而不是VARCHAR。显然,这些列上的行太大,我得到了上述错误。

我配置Hibernate的方式是使用映射文件。

下面是如何映射的属性之一是这样的:

<property name="transmission_current_range" type="java.lang.String" length="65535"> 
     <column name="TRANSMISSION_CURRENT_RANGE"/> 
</property> 

通知我,希望这将解决我的问题设置长度到65535,但事实并非如此。

你如何告诉Hibernate你希望这个列是一个TEXT而不是VARCHAR?我已经看过使用adnotations的例子,但我想用我的映射文件来做同样的事情。

另外,TEXT的相应java类型是什么?我搜索了这个,但我发现只有java.lang.String,这是用于VARCHAR和TEXT相同的数据类型,所以它没有帮助。

编辑:显然,这个问题是不是因为我需要将数据变成“TEXT”,而不是“字符串,而是因为我有这么多列,每行(列)超过8126

极限

我得到这个错误,现在:

行大小太大。已用表类型的最大行大小(不计算BLOB)为8126.这包括存储开销,请查阅手册。你必须改变一些列为文本或BLOB

EDIT2:显然,这个错误的原因是,我有这么多的列,行长变得太大了,所以这不是一个问题文本,而不是VARCHAR 本身,而是,我只是在列长度方面太多“数据”。

改变MySQL的CFG文件innodb_strict_mode = 0解决了这个问题,但是当我让Hibernate创建数据库同样,自动创建的列是BLOB,而不是它们的原始数据类型(其中一些仍保持为它们的原始数据类型)

这就像任何人选择我的解决方案一样。

回答

0

好的,我已经设法解决我的问题。该解决方案是这条线,插在“/etc/mysql/my.cnf”文件中的[mysqld]类别:

innodb_strict_mode = 0 

就是这样。现在我可以插入所有的列,并且不再有错误了。

0

使用text,而不是java.lang.String

<property name="transmission_current_range" 
    type="text" length="65535"> 
     <column name="TRANSMISSION_CURRENT_RANGE"/> 
</property> 
+0

我改变了所有以前的“java。lang.String“类型与上面的完全相同,但我仍然得到错误 现在生成的列是”longtext“类型的,但是我得到的错误是 –

+1

OK,这很好,现在意味着你的数据库引擎需要更多的配置;例如在MySQL的情况下:http://stackoverflow.com/q/15585602/248082 – nobeh

+0

我看到的是InnoDB?我正在使用MySQL。 –

0

Hibernate文档提到了<column>元素的sql-type。你可以尝试:

<column name="TRANSMISSION_CURRENT_RANGE" sql-type="text"/> 
+0

尝试了你的建议,我也遇到了同样的错误。这没有任何意义。另外,Hibernate的建议非常模糊:“行大小太大(> 8126)。将某些列更改为TEXT或BLOB可能会有所帮助。” 它甚至没有说哪些列不起作用。 –