2010-02-26 25 views
2

我使用JPA(Hibernate)和jTDS作爲我的jdbc驅動程序。只要我的實體列的數據類型是字符串,創建的預準備語句就使用varchar(8000)作爲其參數。例如,我已經嘗試在我的映射中使用@Column(length=50),但它似乎被忽略。爲什麼JPA,Hibernate和jTDS總是對字符串列使用varchar(8000)?

如果我在jTDS連接中設置了sendStringParametersAsUnicode,它使用nvarchar(4000)來代替,但從來不會考慮我在我的實體中定義的lentghs。這是有原因的嗎?

+0

什麼休眠方言它使用? – skaffman 2010-02-26 21:20:19

+0

SQLServerDialect – user266391 2010-02-26 21:28:13

+0

究竟是什麼問題?預期的行爲是什麼?你是在談論生成的表格中列的長度還是其他的東西? – 2010-02-27 03:01:00

回答

1

我意識到這是一個古老的問題,但最近碰到這個我自己,我想我已經擺脫了一些光。

這似乎是jtds驅動程序中的故意。

如果你看一下TdsData.java,你會看到這種情況發生在這個代碼塊:

} else { 
    if (pi.isUnicode && len <= MS_LONGVAR_MAX/2) { 
     pi.tdsType = XSYBNVARCHAR; 
     pi.sqlType = "nvarchar(4000)"; 
    } else if (!pi.isUnicode && len <= MS_LONGVAR_MAX) { 
     CharsetInfo csi = connection.getCharsetInfo(); 
     try { 
      if (len > 0 && csi.isWideChars() && 
      pi.getBytes(csi.getCharset()).length > MS_LONGVAR_MAX) { 
       pi.tdsType = SYBTEXT; 
       pi.sqlType = "text"; 
      } else { 
       pi.tdsType = XSYBVARCHAR; 
       pi.sqlType = "varchar(8000)"; 
      } 
相關問題