1. 程式人生 > >org.hibernate.HibernateException: Wrong column type

org.hibernate.HibernateException: Wrong column type

property 入門 錯誤 lar per connect set conn 定義

這個問題一般出現在我們使用定長的字符串作為主鍵(其它字段也可能)的時候,如數據庫中的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. public class User {
  3. private String id;
  4. private String name;
  5. private char sex;
  6. private int age;
  7. public int getAge() {
  8. return age;
  9. }
  10. public String getId() {
  11. return id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public char getSex() {
  17. return sex;
  18. }
  19. public void setAge(int i) {
  20. age = i;
  21. }
  22. public void setId(String string) {
  23. id = string;
  24. }
  25. public void setName(String string) {
  26. name = string;
  27. }
  28. public void setSex(char c) {
  29. sex = c;
  30. }
  31. }


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. <hibernate-mapping>
  6. <class name="onlyfun.caterpillar.User" table="USER">
  7. <id name="id" type="string" unsaved-value="null">
  8. <column name="user_id" sql-type="char(32)" />
  9. <generator class="uuid.hex"/>
  10. </id>
  11. <property name="name" type="string" not-null="true">
  12. <column name="name" length="16" not-null="true"/>
  13. </property>
  14. <property name="sex" type="char"/>
  15. <property name="age" type="int"/>
  16. </class>
  17. </hibernate-mapping>


hibernate.cfg.xml文件配置

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


上面只是個簡單的配置實例,主要在於展示User的char(32)類型的ID如何配置。

剛接觸Hibernate,有些簡單的問題也會搞得你暈頭轉向,以此作為自己的學習筆記,歡迎指導!

org.hibernate.HibernateException: Wrong column type