2010-01-21 80 views
7

在我的Web應用程序中,我有一個文本區域,其用戶填充的內容最終通過Hibernate持久保存到數據庫。我遇到了一個問題,即當用戶輸入超出特定長度時,持久性失敗。有沒有一種方法可以通過Hibernate Annotations或配置表明這個特定的字段應該支持更長的字符串,並且數據庫列類型應該反映這一點?問題在Hibernate中持久化長字符串

下面是我得到異常:

Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column 'introText' at row 1 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2007) 
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1443) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    ... 41 more 
+0

你爲什麼說它失敗了呢?它會在後臺無聲地截斷字符串還是會收到錯誤消息?如果你告訴休眠,它是字符串類型,它會嘗試保存所有內容。 – 2010-01-21 20:38:25

+0

用戶內容在String對象中設置。持久性期間拋出異常。 – lupefiasco 2010-01-21 20:39:56

+0

你能否在你的文章中發佈異常? :)也許是你當前映射的片段。 – 2010-01-21 20:41:35

回答

20

你可以使用長度參數上的標註,像這樣:

@Column(length=1000) 

,或者你可以列類型更改爲類似如果您的數據庫支持文本,如下所示:

@Column(columnDefinition="text") 

如果您使用的是hbm2ddl更新,並且該列將被創建爲使用該類型(數據庫特定)。

+2

只是爲了補充,這裏的長度需要是一個int,因此@Column(length = 1000) – Thomas 2012-11-05 13:00:09

+1

對於我們的項目,我們希望psql-database對於沒有指定大小的某些列使用VARCHAR類型。爲此,我們使用:@Column(columnDefinition =「VARCHAR」) – mahler 2012-11-06 16:17:08

+0

尤其是因爲在PostgreSQL中「varchar」與「text」相同。 http://stackoverflow.com/questions/4848964/postgresql-difference-between-text-and-varchar-character-varying – tgharold 2012-11-21 23:20:33

0

確定這實際上是一個數據庫錯誤。

Data too long for column 'introText' 

檢查你的數據庫中的introText列,它可能是一個大小有限的varchar。您需要將存儲類型更改爲更大,以免截斷文本。

如果你認爲不是這樣,你將不得不顯示你的映射和模式。

5

我不得不說我被分配休眠「文本」類型的物業解決了類似的問題:

@Type(type="text")