2017-03-15 42 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可能會有所幫助。」 它甚至沒有說哪些列不起作用。 –