• org.hibernate.HibernateException: Wrong column type


            这个问题一般出现在我们使用定长的字符串作为主键(其它字段也可能)的时候,如数据库中的ID为char(16)。虽然很多资料上都说不推荐这样做,但实际上我们在做很多小case的时候自己为了方便也顾不得那么多,随心所欲地设计。其实我们就用INT的主键,只是对你原有的ID(char(16))增加一个Unique Check或者是像在MySQL中增加一个Unique索引又费得了多少事呢。

            如果使用char()做为主键时出现如题错误,其很可能的原因在于你的hibernate.cfg.xml文件中的关于Hibernate映射到数据定义语言(DDL)的配置

    [html] view plain copy
     
    1. <property name="hbm2ddl.auto">validate</property>  

            当hbm2ddl设置为validate,每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。validate的具体内部实现我不清楚,但我想正是因为每次验证比较导致了如题问题的出现。数据库里字段类型为char(),而你的对象属性为java.lang.String,出现了错误的列类型。

           这样的错误并不是经常出现,原因在于我们配置hibernate.cfg.xml文件的时候一般不配置hbm2ddl这一项,即使用默认值“update”,而且在开发或学习的过程中我们通常会配置为“create”,也就很难遇到这样的错误。到这里解决办法已经很明确了,即更改你的hbm2ddl配置。

           下面给出一个使用char()做主键的配置实例(源自: Dashboard(Hibernate入门)):

           在mysql中新增一個HibernateTest資料庫,並建立USER表格

    [sql] view plain copy
     
    1. CREATE TABLE USER (  
    2.     user_id CHAR(32) NOT NULL PRIMARY KEY,  
    3.     name VARCHAR(16) NOT NULL,  
    4.     sex CHAR(1),  
    5.     age INT  
    6. );  

           

          Java类User.java

    [java] view plain copy
     
    1. package onlyfun.caterpillar;  
    2.   
    3. public class User {  
    4.     private String id;  
    5.     private String name;  
    6.     private char sex;  
    7.     private int age;  
    8.   
    9.     public int getAge() {  
    10.         return age;  
    11.     }  
    12.   
    13.     public String getId() {  
    14.         return id;  
    15.     }  
    16.   
    17.     public String getName() {  
    18.         return name;  
    19.     }  
    20.   
    21.     public char getSex() {  
    22.         return sex;  
    23.     }  
    24.   
    25.     public void setAge(int i) {  
    26.         age = i;  
    27.     }  
    28.   
    29.     public void setId(String string) {  
    30.         id = string;  
    31.     }  
    32.   
    33.     public void setName(String string) {  
    34.         name = string;  
    35.     }  
    36.   
    37.     public void setSex(char c) {  
    38.         sex = c;  
    39.     }  
    40. }  


           User.hbm.xml文件配置

    [html] view plain copy
     
    1. <?xml version="1.0"?>  
    2. <!DOCTYPE hibernate-mapping  
    3.     PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"  
    4.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  
    5.   
    6. <hibernate-mapping>  
    7.   
    8.     <class name="onlyfun.caterpillar.User" table="USER">  
    9.   
    10.         <id name="id" type="string" unsaved-value="null">  
    11.             <column name="user_id" sql-type="char(32)" />  
    12.             <generator class="uuid.hex"/>  
    13.         </id>  
    14.   
    15.         <property name="name" type="string" not-null="true">  
    16.             <column name="name" length="16" not-null="true"/>  
    17.         </property>  
    18.   
    19.         <property name="sex" type="char"/>  
    20.   
    21.         <property name="age" type="int"/>  
    22.   
    23.     </class>  
    24.   
    25. </hibernate-mapping>  


           hibernate.cfg.xml文件配置

    [html] view plain copy
     
    1. <hibernate-configuration>  
    2.   
    3.     <session-factory>  
    4.   
    5.         <property name="show_sql">true</property>  
    6.           
    7.         <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>  
    8.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
    9.   
    10.         <property name="connection.url">jdbc:mysql://localhost/HibernateTest</property>  
    11.         <property name="connection.username">caterpillar</property>  
    12.       
    13.         <property name="connection.password">123456</property>  
    14.   
    15.         <mapping resource="User.hbm.xml"/>  
    16.   
    17.     </session-factory>  
    18.   
    19. </hibernate-configuration>  


          上面只是个简单的配置实例,主要在于展示User的char(32)类型的ID如何配置。

          刚接触Hibernate,有些简单的问题也会搞得你晕头转向,以此作为自己的学习笔记,欢迎指导!

  • 相关阅读:
    论文阅读 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning
    升级openssh的补救
    二阶魔方
    Extra argument start service sshd does not support chkconfig
    通用帮助类集合Shiny.Helper库的使用
    .net core Redis客户端Shiny.Redis包库的使用
    .net core mqtt客户端Shiny.Mqtt库的使用
    基于Sqlsugar单例模式封装的库ShinySqlSugar的使用
    加速训练之并行化 tf.data.Dataset 生成器
    ffmpeg protocol concat 进行ts流合并视频的时间戳计算及其音画同步方式一点浅析
  • 原文地址:https://www.cnblogs.com/mannixiang/p/7222240.html
Copyright © 2020-2023  润新知