標籤:索引 .net creat arc property sql cas .so factory
這個問題一般出現在我們使用定長的字串作為主鍵(其它欄位也可能)的時候,如資料庫中的ID為char(16)。雖然很多資料上都說不推薦這樣做,但實際上我們在做很多小case的時候自己為了方便也顧不得那麼多,隨心所欲地設計。其實我們就用INT的主鍵,只是對你原有的ID(char(16))增加一個Unique Check或者是像在MySQL中增加一個Unique索引又費得了多少事呢。
如果使用char()做為主鍵時出現如題錯誤,其很可能的原因在於你的hibernate.cfg.xml檔案中的關於Hibernate映射到資料定義語言 (Data Definition Language)(DDL)的配置
[html] view plain copy
- <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
- CREATE TABLE USER (
- user_id CHAR(32) NOT NULL PRIMARY KEY,
- name VARCHAR(16) NOT NULL,
- sex CHAR(1),
- age INT
- );
Java類User.java
[java] view plain copy
- package onlyfun.caterpillar;
-
- public class User {
- private String id;
- private String name;
- private char sex;
- private int age;
-
- public int getAge() {
- return age;
- }
-
- public String getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public char getSex() {
- return sex;
- }
-
- public void setAge(int i) {
- age = i;
- }
-
- public void setId(String string) {
- id = string;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- public void setSex(char c) {
- sex = c;
- }
- }
User.hbm.xml檔案配置
[html] view plain copy
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping
- PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
-
- <hibernate-mapping>
-
- <class name="onlyfun.caterpillar.User" table="USER">
-
- <id name="id" type="string" unsaved-value="null">
- <column name="user_id" sql-type="char(32)" />
- <generator class="uuid.hex"/>
- </id>
-
- <property name="name" type="string" not-null="true">
- <column name="name" length="16" not-null="true"/>
- </property>
-
- <property name="sex" type="char"/>
-
- <property name="age" type="int"/>
-
- </class>
-
- </hibernate-mapping>
hibernate.cfg.xml檔案配置
[html] view plain copy
- <hibernate-configuration>
-
- <session-factory>
-
- <property name="show_sql">true</property>
-
- <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
-
- <property name="connection.url">jdbc:mysql://localhost/HibernateTest</property>
- <property name="connection.username">caterpillar</property>
-
- <property name="connection.password">123456</property>
-
- <mapping resource="User.hbm.xml"/>
-
- </session-factory>
-
- </hibernate-configuration>
上面只是個簡單的配置執行個體,主要在於展示User的char(32)類型的ID如何配置。
剛接觸Hibernate,有些簡單的問題也會搞得你暈頭轉向,以此作為自己的學習筆記,歡迎指導!
org.hibernate.HibernateException: Wrong column type