執行sql出現No Dialect mapping for JDBC type: -9錯誤


name的數據類型是nvarchar嗎?如果是改為varchar類型應該能運行,但是這個治標不治本,這是hibernate沒映射nvarchar

 

剛才整理了一下varcharnvarchar的區別,然后用Hibernate映射到數據庫時,發現String類型被映射為了varchar,就在網上找了一下怎樣將String映射為nvarchar。

方法一:

對於String類型,你可能是這樣映射的

 

[java]  view plain copy
 
  1.        private String name;  
  2.   
  3. @Column(length = 20 , nullable = false , unique = true)  
  4. public String getName() {  
  5.     return name;  
  6. }  

 

查看數據庫,你會發現name字段應該是這樣 name varchar(20);

現在我們修改一下Annotation,讓他映射為 name nvarchar(20)

 

[java]  view plain copy
 
  1.        private String name;  
  2.   
  3. @Column(length = 20 , nullable = false , unique = true , columnDefinition="nvarchar(20)")  
  4. public String getName() {  
  5.     return name;  
  6. }  

再查看數據庫,你會發現現在應該是 name nvarchar(20);

 

注意:加上columnDefinition之后,length好像沒有作用了,必須要在columnDefinition的value中指定長度。

 

[java]  view plain copy
 
  1.        private String name;  
  2.   
  3. @Column(nullable = false , unique = true , columnDefinition="nvarchar(20)")  
  4. public String getName() {  
  5.     return name;  
  6. }  

 

方法二:

 

這個沒有試,看上去應該可以。

就是繼承SQLServerDialect ,寫一個自己的,然后再xml中配置一下。

方法網址:http://stackoverflow.com/questions/1099413/how-can-hibernate-map-the-sql-data-type-nvarcharmax

 

[java]  view plain copy
 
  1. public class SQLServerNativeDialect extends SQLServerDialect {  
  2.      public SQLServerNativeDialect() {  
  3.          super();  
  4.          registerColumnType(Types.VARCHAR, "nvarchar($l)");  
  5.          registerColumnType(Types.CLOB, "nvarchar(max)");  
  6.      }  
  7.   
  8.     public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {  
  9.         if(code != 2005) {  
  10.             return super.getTypeName(code, length, precision, scale);  
  11.         } else {  
  12.             return "ntext";  
  13.         }  
  14.     }  
  15. }  

總結:

        順便查了一下columnDefinition,發現他可以設置默認值。Hibernate會把columnDefinition 的內容直接寫在生成標的ddl中,因此語法必須正確。

 

[java]  view plain copy
 
  1. @Column(columnDefinition="int default 0",nullable=false)  

 

 

 

columnDefinition

public abstract java.lang.String columnDefinition
(Optional) The SQL fragment that is used when generating the DDL for the column.

Defaults to the generated SQL to create a column of the inferred type.

 



Default:""

(摘)可選: 為這個特定字段覆蓋sql DDL片段 (這可能導致無法在不同數據庫間移植)

 

 

 

 

 

 

 

 

 

                                    來源:http://hai0378.iteye.com/blog/2038872


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM