Hibernate JPA,MySQL和TinyInt(1)用于布尔值而不是位或字符

2022-08-31 16:37:02

这是我的JPA2 / Hibernate定义:

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

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


答案 1

@Type注释是休眠注释。

在完整的 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;

答案 2

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

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

这确实映射到 INTEGER 类型,但它可能与 TINYINT 一起工作。

更新:在某些RDBMS中不能与TINYINT一起使用。将数据库列类型切换为 INTEGER。或者根据需要使用其他 Java @Type值或列定义。org.hibernate.type.NumericBooleanType

在这个例子中,Dude的答案可以在不进行任何数据库更改的情况下工作。@Column(nullable = false, columnDefinition = "TINYINT(1)")


推荐