57

这是我的 JPA2 / Hibernate 定义:

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

在 MySql 中,此列被解析为 bit(1) 数据类型——这对我不起作用。对于遗留问题,我需要将布尔值映射到 tinyint 而不是一点点。但我看不到更改默认数据类型的可能性。有没有?

4

6 回答 6

69

@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

顺便说一句,您现在可以像这样使用长度属性:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
于 2012-04-19T09:06:45.190 回答
45

尝试NumericBooleanType. 由于某种原因,它没有声明的短类型名称,因此您必须使用:

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

这确实映射到 INTEGER 类型,但它可能适用于 TINYINT。

更新:在某些org.hibernate.type.NumericBooleanTypeRDBMS中不适用于 TINYINT。将数据库列类型切换为 INTEGER。或酌情使用不同的 Java @Type 值或 columnDefinition。

在此示例中,Dude 的答案@Column(nullable = false, columnDefinition = "TINYINT(1)")将在没有任何数据库更改的情况下工作。

于 2010-08-01T19:22:18.020 回答
5

我在 MySQL 数据库上使用 JPA 和 Spring Data/Hibernate 5.0。

在我的 Entity 对象中,我输入了以下内容:

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

我的开发环境已将休眠 auto-ddl 设置为更新,因此当我部署到开发时,它创建了带有 tinyint(1) 类型的 column_name 的表。

我使用此列的代码将 null 视为 false,因此我不担心 null,如果是,您可以将其设为原始布尔值或在 Column 注释中添加“, nullable = false”。

此解决方案完全是 JPA(不使用休眠类型注释)并且不需要更改连接字符串。

于 2017-11-26T00:10:49.267 回答
2

我有这个错误:

原因:org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/config/context-config.xml] 中定义名称为“sessionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 org.hibernate.MappingException:无法确定类型:org.hibernate.type.NumericBooleanType,在表:bookingItem,对于列:[org.hibernate.mapping.Column(enabled)]

这对我有用:

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
于 2015-08-06T11:29:47.283 回答
2

使用 Microsoft sql 和某些版本的 mysql 时,请使用以下内容:

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

对我来说,tinybit、boolean 和其他此类定义都失败了。

于 2019-04-16T14:43:15.397 回答
0

老问题,但可能会节省某人的时间。

我正在使用 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 中都可以正常工作......

于 2020-05-17T09:20:47.950 回答