2012-11-29 52 views
5

我正在休眠例外:奇怪的休眠異常與列類型

錯列式。發現:位,預期:布爾值默認值TRUE

我有類用戶:

package mypackage; 

import javax.persistence.*; 
import java.util.ArrayList; 
import java.util.List; 

@Entity 
@Table(name = "USER") 
public class User { 

    @Id 
    @GeneratedValue 
    @Column(name = "ID", unique = true, nullable = false) 
    private Long id; 

    @Column(name = "STATUS", columnDefinition = "BOOLEAN DEFAULT TRUE", 
           nullable = false) 
    private Boolean status = Boolean.TRUE; 

    // getters and setters 
} 

這正常工作,如果在休眠創建數據庫表本身。當

<property name="hibernate.hbm2ddl.auto">create</property> 

<property name="hibernate.hbm2ddl.auto">create-drop</property> 

但如果

  1. 我運行了一個程序,允許Hibernate創建該表
  2. 然後我的hibernate.hbm2ddl.auto的值更改爲驗證
  3. ,我與已經由Hibernate與生成的表格再次運行我的程序

    <property name="hibernate.hbm2ddl.auto">validate</property> 
    

所以我得到異常:

org.hibernate.HibernateException:錯誤的列爲STATUS列輸入dbtest.user。發現:位,預計:BOOLEAN DEFAULT TRUE

任何想法這可能是Hibernate的這種行爲的原因,我該如何解決它?我使用MySQL server 5.1Hibernate 4.0.1

Run類只是兩行:

public class Run { 

    public static void main(String[] main) { 

    SessionFactory sessionFactory = 
       new AnnotationConfiguration().configure().buildSessionFactory(); 

    Session session = sessionFactory.getCurrentSession(); 
    } 
} 

表的結構:

CREATE TABLE USER (
    ID BIGINT(20) NOT NULL AUTO_INCREMENT, 
    STATUS TINYINT(1) NOT NULL DEFAULT 1, 
    PRIMARY KEY (ID), 
    UNIQUE INDEX ID (ID) 
) 
COLLATE='utf8_general_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=2 

hibernate.cfg

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/dbtest</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">root</property> 

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="current_session_context_class">thread</property> 
    <property name="connection.pool_size">5</property> 
    <property name="hibernate.transaction.flush_before_completion">true</property> 
    <property name="hibernate.transaction.auto_close_session">true</property> 
    <property name="hibernate.hbm2ddl.auto">validate</property> 
    <property name="hibernate.show_sql">false</property> 
    <property name="hibernate.format_sql">true</property> 
    <property name="hibernate.use_sql_comments">false</property> 
    <property name="hibernate.connection.charSet">true</property> 

    <mapping class="mypackage.User"/> 
    </session-factory> 
</hibernate-configuration> 

休眠與TINYINT類型創建表和我不干涉數據並且不要手動對錶格進行任何更改!我只是將hibernate.hbm2ddl.auto更改爲validate,沒有別的。

+1

相關:HTTP://計算器。 com/questions/289727 –

+0

如果我在註釋中選擇了「BIT DEFAULT 1」而不是「BOOLEAN DEFAULT TRUE」,那麼我的表中沒有**默認值**。我在db中得到了'STATUS BIT(1)NOT NULL'。 –

+1

所以我的問題可以改寫爲以下方式:**如何使用Hibernate註釋正確聲明布爾字段的默認值?** –

回答

0
private Boolean status = Boolean.TRUE; 

應該導致默認值爲true。

解決這個問題的另一種方法是使用:

@PrePersist 
public void prePersist() 
{ 
    if (status == null) 
    { 
     status = Boolean.TRUE; 
    } 
} 
0

胡亂猜測,因爲我沒有使用註釋形式的映射,但這裏有雲:

這columnDefinition貌似明確告訴Hibernate來使用默認值true的布爾列類型,但MySql沒有布爾類型,所以也許

columnDefinition = "BOOLEAN DEFAULT TRUE" 

應該是這樣的

columnDefinition = "tinyint DEFAULT 1" 
2

正如其他人已經說過:在MySql中沒有布爾列類型。我有一個類似的問題,並「創造」了一種自己的方言。它擴展了默認的MySQL5Dialect,並將stanard sql-type BOOLEAN註冊到MySql列類型位。

public class Mysql5BitBooleanDialect extends MySQL5Dialect{  
    public Mysql5BitBooleanDialect() { 
     super(); 
     registerColumnType(java.sql.Types.BOOLEAN, "bit");   
    }  
} 

然後,您可以設置在Hibernate屬性的話使用它:hibernate.dialect = your.package.Mysql5BitBooleanDialect

希望這有助於..