2011-12-29 26 views
32

我想從Hibernate 3.6.5升級到4.0(並從Spring 3.0.5到Hibernate 4支持所需的3.1)。「發現:位,期望:布爾」後休眠4升級

現在,MySQL和HSQL,我遇到了此問題持續布爾字段:

Caused by: org.hibernate.HibernateException: 
Wrong column type in PUBLIC.PUBLIC.EVENT for column Checked. Found: bit, expected: boolean 
    at org.hibernate.mapping.Table.validateColumns(Table.java:282) 
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1268) 
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314) 

JPA @Entity@Column註釋域對象被使用,並且有問題的領域是這樣的:

@Column(name = "Checked") 
private boolean checked; 

HSQL模式:

Checked bit default 0 not null, 

MySQL的架構:

`Checked` tinyint(1) NOT NULL default '0', 

什麼是解決此同時與Hibernate 4堅持最簡單的方法是什麼?我應該更改數據庫模式,Hibernate配置還是域類註釋?

我不知道如果代碼和配置是完全「正確」之前,但至少它好工作與Hibernate 3

+0

使用HSQL,在架構文件*中將「bit」更改爲「boolean」似乎有助於(即,然後我遇到不同的Hibernate 4問題)。這雖然有點奇怪,因爲[HSQL文檔](http://hsqldb.org/doc/guide/ch09.html#datatypes-部分)給人的印象是BOOLEAN和BIT是等價的。 – Jonik 2011-12-29 13:24:40

回答

43

我通過在@Column行中添加columnDefinition = "BIT"來解決這個問題。

@Basic 
@Column(name = "B", columnDefinition = "BIT", length = 1) 
public boolean isB() { 
    return b; 
} 

它在DB中也被定義爲'BIT(1)'。還與TINYINT合作。這是我找到的最簡單的解決方案,因爲更改超級輕微,無需觸摸數據庫。

使用:MySQL服務器5.5.13,休眠4.1.1,JDK 1.6

+1

不再需要休眠版本4.3.0 + – Ishmael 2015-07-16 19:57:42

0

發現問題 我也得到了org.hibernate.HibernateException:錯列式...發現:位,預期:布爾

上BooleanType休眠4,他們改變了構造函數來

public BooleanType() { 
    this(org.hibernate.type.descriptor.sql.BooleanTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE); 
} 

代替舊版本

public BooleanType() { 
    this(BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE); 
} 
+0

恩,那麼解決方案是什麼?引用我的問題:「在堅持Hibernate 4的同時,最直接的解決方法是什麼?我應該更改數據庫模式,Hibernate配置還是域類註釋?」 – Jonik 2012-01-12 14:17:27

+0

@Jonik:你解決了嗎?我有同樣的問題.. – 2012-03-26 13:28:50

19

我有同樣的問題,我擴展了方言,以考慮到事實,即mysql將布爾值視爲位的別名。

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

我不使用更長的位()字段(以表示例如byte []),所以這可能會破壞它。

+2

這似乎是(另一種)在Hibernate的MySQL方言中與類型相關的大型監督。 4.0版本發佈後我推遲了升級,我很驚訝它一年後還沒有解決。但謝謝你的提示。任何時候我註釋一個布爾字段,擴展方言和更新persistence.xml似乎比添加columnDefinition要好得多。我使用Hibernate作爲JPA實現,我希望儘可能保持非配置位儘可能與實現無關。 – spaaarky21 2013-01-01 04:43:47

+1

然而6個月後問題仍然存在。最糟糕的是由hibernate2ddl自身生成的模式本身在MySQL中使用布爾值。所以Hibernate生成的模式不能通過Hibernate驗證:( – 2013-06-25 09:50:52

+2

最後它應該在下一版本(4.3.0)中更正:https://hibernate.atlassian.net/browse/HHH-6935 – TahitianGabriel 2013-07-24 01:08:33

7

我能夠加入到transformedBitIsBoolean=true我的MySQL連接字符串來解決這個問題。在這裏看到:https://hibernate.atlassian.net/browse/HHH-6935

+0

這比編碼要好得多:-) – Atais 2014-03-19 15:57:55

+1

爲我工作(Hibernate 4.1.x)。因爲起初我不明白這裏是什麼意思:在persistence.xml中: opncow 2017-01-14 18:54:27