2009-07-08 148 views
10

我在SQL 2005數據庫中的列曾經是一個VARCHAR(最大),但它已被更改爲爲nvarchar(最大)Hibernate如何映射SQL數據類型nvarchar(max)?

現在我需要更新我的Hibernate映射文件,以反映變化,這是它使用的是:

<元素類型=「文本」列=「值」/>

當試圖運行應用程序時,出現以下錯誤:

org.hibernate.HibernateException:[表]錯列類型列值。發現:ntext的,預期:文本

我應該把什麼在「類型」屬性正確映射列作爲爲nvarchar(最大)

我試過設置類型爲ntext,但是hibernate並不知道那是什麼。我試過設置的類型爲字符串,但它對待字符串作爲文本類型。

回答

7

Tremend Tech Blog找到答案。你必須寫自己的SQLServerDialect類,它看起來是這樣的:

該類Hibernate的類型映射到SQL類型,因此類將映射爲nvarchar(最大) SQL數據類型設置爲休眠的CLOB數據類型。

getTypeName方法被用來當Hibernate詢問與2005碼(看起來像它的數據類型爲nvarchar(max)數據類型)的數據類型返回「NTEXT」。

最後,您需要將您的hibernate持久性方言改爲這個新的SQLServerDialect類,它允許hibernate將數據類型轉換爲SQL數據類型。

+2

你爲什麼要註冊列類型COLB?這個$ 1在nvarchar($ 1)中的含義是什麼?謝謝 – 2013-10-07 05:13:42

+1

這是很久以前的事了,我不記得,但是registerColumnType()將SQL類型映射到Hibernate類型。 $ l(L,不是#1)是表示nvarchar列長度的匹配模式。如果nvarchar列具有定義的長度,則它將映射到VARCHAR類型。如果nvarchar列具有最大長度,則它將被映射到CLOB類型。 – ampersandre 2013-11-19 19:23:44

+1

請注意,對於SQL Server 2014,我必須*刪除*上面的代碼中重寫的方法'getTypeName'! – vikingsteve 2016-04-13 11:08:24

0

我認爲它是 registerColumnType(Types.VARCHAR,「nvarchar($ l)」); //升像_l_ength,而不是1

+0

它是$ 1。例如registerColumnType(Types.NVARCHAR,4000,「nvarchar($ 1)」); – Eyal 2015-10-28 08:20:26

11

什麼工作對我來說是把實際的列定義在@Column批註:

@Column(name="requestXml", columnDefinition = "ntext") 
private String request; 
+3

這也適用於我。我在數據庫中使用nvarchar(max),@Column(name =「colName」,columnDefinition =「nvarchar」)修復了它。 – petrsyn 2014-09-17 13:20:23

+0

謝謝,它也適用於我! – digz6666 2016-10-21 09:38:45

1

它可以通過 @Nationalized 註釋從休眠狀態是固定的,即標記字符數據類型,如國有化變體(NVARCHAR,NCHAR,NCLOB等)。

相關問題