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

Ta *_*Sas 46 java mysql hibernate jpa jpa-2.0

这是我的JPA2/Hibernate定义:

Code:
@Column(nullable = false)
private boolean enabled;
Run Code Online (Sandbox Code Playgroud)

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

Don*_*llo 63

@Type注释是一个Hibernate注释.

在完整的JPA2(使用Hibernate 3.6+)中,将布尔字段映射到TINYINT(1)SQL类型而不是BIT(1)的方法是使用columnDefinition属性.

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
Run Code Online (Sandbox Code Playgroud)

nb:length属性似乎在这种情况下没有效果,然后我们使用(1)语法.


使用Hibernate 4.0+,这种语法可能会导致运行时错误,如下所示:

Wrong column type Found: bit, expected: TINYINT(1)
Run Code Online (Sandbox Code Playgroud)

看来在这种情况下,你唯一的办法是在MySQL数据源连接字符串中使用tinyInt1isBit = false,如下所示:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您现在可以使用如下的length属性:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
Run Code Online (Sandbox Code Playgroud)

  • 由于MySQL别名`BOOLEAN`到`TINYINT(1)`,也可以使用`columnDefinition ="BOOLEAN"`,这可能更具可读性. (3认同)
  • `columnDefinition ="TINYINT",length = 1`是带有::`tinyint(4)`的列.可能是什么原因? (3认同)

Mik*_*e Q 38

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

@Column(nullable = false)
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean enabled;
Run Code Online (Sandbox Code Playgroud)

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

UPDATE:org.hibernate.type.NumericBooleanType难道不是在某些RDBMS与TINYINT工作.将数据库列类型切换为INTEGER.或者根据需要使用不同的Java @Type值或columnDefinition.

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


小智 5

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

在我的实体对象中,我放置了以下内容:

@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;
Run Code Online (Sandbox Code Playgroud)

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

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

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