簡體   English   中英

用於布爾值而非位或字符的休眠 JPA、MySQL 和 TinyInt(1)

[英]Hibernate JPA, MySQL and TinyInt(1) for Boolean instead of bit or char

這是我的 JPA2/Hibernate 定義:

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

在 MySql 中,此列被解析為 bit(1) 數據類型 - 這對我不起作用。 對於遺留問題,我需要將布爾值映射到 tinyint,而不是一點點。 但我看不到更改默認數據類型的可能性。 有沒有?

@Type 注解是一個 Hibernate 注解。

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

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

nb: length 屬性在這種情況下似乎沒有作用,那么我們使用 (1) 語法。


使用Hibernate 4.0+ ,這種語法會導致運行時錯誤,如下所示:

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

似乎在這種情況下,您唯一的方法是在 MySQL 數據源連接字符串中使用tinyInt1isBit=false ,如下所示:

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

順便說一句,您現在可以像這樣使用 length 屬性:

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

試試NumericBooleanType 出於某種原因,它沒有聲明的短類型名稱,因此您必須使用:

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

這確實映射到 INTEGER 類型,但它可能適用於 TINYINT。

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

在此示例中,Dude 對@Column(nullable = false, columnDefinition = "TINYINT(1)")的回答無需任何數據庫更改即可工作。

我在 MySQL 數據庫上使用 JPA 和 Spring Data/Hibernate 5.0。

在我的實體對象中,我放置了以下內容:

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

我的開發環境將休眠自動 ddl 設置為更新,因此當我部署到開發時,它創建了帶有 tinyint(1) 類型的 column_name 的表。

我使用此列的代碼將 null 視為 false,因此我不擔心 null,如果是,您可以將其設為原始布爾值或在 Column 注釋中添加“, nullable = false”。

此解決方案完全是 JPA(不使用休眠類型注釋)並且不需要更改連接字符串。

我有這個錯誤:

引起:org.springframework.beans.factory.BeanCreationException:在ServletContext資源[/WEB-INF/config/context-config.xml]中定義名稱為'sessionFactory'的bean創建錯誤:初始化方法調用失敗; 嵌套異常是 org.hibernate.MappingException:無法確定類型:org.hibernate.type.NumericBooleanType,在表:bookingItem,對於列:[org.hibernate.mapping.Column(enabled)]

這對我有用:

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

使用 Microsoft sql 和某些版本的 mysql 時,請使用以下內容:

@Column(name = "eanbled", columnDefinition = "bit default 0", nullable = false)
private boolean enabled;

對我來說,tinybit、boolean 和其他這樣的定義失敗了。

老問題,但可能會節省某人的時間。

我正在使用 Spring Data JPA 2.2.5。 當我使用相同的代碼庫同時使用 MySQL 和 MariadDB 時,我遇到了類似的問題。 它在一個上起作用,在另一個上不起作用。

問題是,我將字段創建為未簽名。

我將下面的 SQL 部分從

`is_fixed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',

到下面

`is_fixed` TINYINT(1) NOT NULL DEFAULT '0',

這解決了這個問題,並且在 Mysql 和 MariaDB 中都可以正常工作,沒有任何問題......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM