这是我的JPA2 / Hibernate定义:
Code:
@Column(nullable = false)
private boolean enabled;
在MySql中,此列被解析为bit(1)数据类型 - 这对我不起作用。对于遗留问题,我需要将布尔值映射到tinyint而不是一点点。但我没有看到更改默认数据类型的可能性。有没有?
答案 0 :(得分:58)
@Type注释是一个Hibernate注释。
在完整的JPA2(带有 Hibernate 3.6 + )中,将布尔字段映射到TINYINT(1)SQL类型而不是BIT(1)的方法是使用columnDefinition属性。 / p>
@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;
答案 1 :(得分:37)
试试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)")
的回答可以在没有任何数据库更改的情况下工作。
答案 2 :(得分:2)
我在MySQL数据库上使用JPA和Spring Data / Hibernate 5.0。
在我的Entity对象中,我提出以下内容:
@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;
我的开发环境已将hibernate auto-ddl设置为更新,因此当我部署到dev时,它创建了table_name类型为tinyint(1)的表。
我使用此列的代码将null视为false,所以我不担心空值,如果你是,你可以使它成为一个原始的布尔值或者将“,nullable = false”添加到Column注释。
此解决方案完全是JPA(不使用hibernate Type注释),不需要更改连接字符串。
答案 3 :(得分:1)
我遇到了这个错误:
引起:org.springframework.beans.factory.BeanCreationException: 创建名称为' sessionFactory'的bean时出错定义于 ServletContext资源[/WEB-INF/config/context-config.xml]: 调用init方法失败;嵌套异常是 org.hibernate.MappingException:无法确定以下类型: org.hibernate.type.NumericBooleanType,在表:bookingItem,for columns:[org.hibernate.mapping.Column(enabled)]
这对我有用:
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
答案 4 :(得分:0)
使用Microsoft sql和某些版本的mysql时,请使用以下内容:
@Column(name = "eanbled", columnDefinition = "bit default 0", nullable = false)
private boolean enabled;
对我来说,tinybit,布尔值和其他此类定义都失败了。
答案 5 :(得分: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中正常使用,没有任何问题...