zoukankan      html  css  js  c++  java
  • 执行sql出现No Dialect mapping for JDBC type: -9错误

    name的数据类型是nvarchar吗?如果是改为varchar类型应该能运行,但是这个治标不治本,这是hibernate没映射nvarchar

    刚才整理了一下varcharnvarchar的区别,然后用Hibernate映射到数据库时,发现String类型被映射为了varchar,就在网上找了一下怎样将String映射为nvarchar。

    方法一:

    对于String类型,你可能是这样映射的

     

    [java] view plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/kongxc/p/6397070.html
Copyright © 2011-2022 走看看