2010-08-01 151 views
36

這裏是我的JPA2/Hibernate的定義:Hibernate的JPA,MySQL和TINYINT(1)布爾代替位或字符

Code: 
@Column(nullable = false) 
private boolean enabled; 

在MySQL此列被解析爲一個位(1)數據類型 - 這不不適合我。對於遺留問題,我需要將布爾值映射到tinyint。但我沒有看到更改默認數據類型的可能性。有沒有?

回答

31

嘗試NumericBooleanType。出於某種原因,這並不有一個簡短聲明的類型名稱,所以你不得不使用:

@Column(nullable = false) 
@Type(type = "org.hibernate.type.NumericBooleanType") 
private boolean enabled; 

這確實地圖整數類型,但它可能會很好地工作一個TINYINT。

更新:org.hibernate.type.NumericBooleanType請問不是在某些RDBMS中使用TINYINT。將數據庫列類型切換爲INTEGER。或者根據需要使用不同的Java @Type值或columnDefinition。

在這個例子中,Dude的答案@Column(nullable = false, columnDefinition = "TINYINT(1)")可以在沒有任何數據庫更改的情況下工作。

+0

工作正常,但更改位(1)爲int – zaletniy 2012-03-22 12:48:11

+0

-1後,但僅因爲@Dude answer更好。 – Johan 2013-02-22 18:14:56

+0

這是否也適用於布爾對象? – Rafael 2015-03-09 12:27:32

48

@Type註釋是一個Hibernate註釋。

在完整的JPA2中(使用休眠3.6 +),將布爾字段映射到TINYINT(1)SQL類型而不是BIT(1)的方法是使用columnDefinition屬性。

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 

nb:長度屬性在這種情況下似乎沒有效果,那麼我們使用(1)語法。


隨着休眠4.0+,這種語法可能導致運行時錯誤是這樣的:

Wrong column type Found: bit, expected: TINYINT(1) 

看來,在這種情況下,你唯一的辦法就是使用tinyInt1isBit = FALSE MySQL的數據源的連接字符串像這樣:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false 

順便說一句,你現在還可以使用t他length屬性是這樣的:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1) 
private boolean enabled; 
+0

非常感謝你的兄弟! – 2013-04-05 03:26:11

+3

由於MySQL將'BOOLEAN'替換爲'TINYINT(1)',所以也可以使用'columnDefinition =「BOOLEAN」',它可能更具可讀性。 – eggyal 2013-09-26 09:29:10

+0

你是對的,你也可以使用MySQL的BOOLEAN別名,只要別名被設置爲TINYINT,現在就是這樣。 順便說一下,BOOLEAN和TINYINT都不是標準的SQL數據類型,所以如果您更改數據提供者方言(例如:Oracle),就會冒失敗的風險。 – Donatello 2014-01-27 14:16:03

1

我有這個錯誤:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/context-config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: org.hibernate.type.NumericBooleanType, at table: bookingItem, for columns: [org.hibernate.mapping.Column(enabled)]

而這個工作對我來說:

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 
1

我使用JPA與Spring數據/休眠5.0一個MySQL數據庫。

在我的實體對象,我把以下內容:

@Column(name = "column_name", columnDefinition = "BOOLEAN") 
private Boolean variableName; 

我的開發環境具有休眠自動DDL集更新,所以當我部署到dev的,它創建的表類型TINYINT的列名( 1)。

我使用這個列的代碼認爲null爲false,所以我不擔心null,如果是的話,你可以使它成爲一個原始的布爾值或者添加「,nullable = false」給Column註解。

此解決方案完全是JPA(不使用hibernate Type註釋),並且不需要更改連接字符串。

相關問題