这里是我的JPA2/Hibernate的定义:Hibernate的JPA,MySQL和TINYINT(1)布尔代替位或字符
Code:
@Column(nullable = false)
private boolean enabled;
在MySQL此列被解析为一个位(1)数据类型 - 这不不适合我。对于遗留问题,我需要将布尔值映射到tinyint。但我没有看到更改默认数据类型的可能性。有没有?
这里是我的JPA2/Hibernate的定义:Hibernate的JPA,MySQL和TINYINT(1)布尔代替位或字符
Code:
@Column(nullable = false)
private boolean enabled;
在MySQL此列被解析为一个位(1)数据类型 - 这不不适合我。对于遗留问题,我需要将布尔值映射到tinyint。但我没有看到更改默认数据类型的可能性。有没有?
尝试NumericBooleanType
。出于某种原因,这并不有一个简短声明的类型名称,所以你不得不使用:
@Column(nullable = false)
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean enabled;
这确实地图整数类型,但它可能会很好地工作一个TINYINT。
更新:org.hibernate.type.NumericBooleanType
请问不是在某些RDBMS中使用TINYINT。将数据库列类型切换为INTEGER。或者根据需要使用不同的Java @Type值或columnDefinition。
在这个例子中,Dude的答案@Column(nullable = false, columnDefinition = "TINYINT(1)")
可以在没有任何数据库更改的情况下工作。
@Type注释是一个Hibernate注释。
在完整的JPA2中(使用休眠3.6 +),将布尔字段映射到TINYINT(1)SQL类型而不是BIT(1)的方法是使用columnDefinition属性。
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
nb:长度属性在这种情况下似乎没有效果,那么我们使用(1)语法。
随着休眠4.0+,这种语法可能导致运行时错误是这样的:
Wrong column type Found: bit, expected: TINYINT(1)
看来,在这种情况下,你唯一的办法就是使用tinyInt1isBit = FALSE MySQL的数据源的连接字符串像这样:
jdbc:mysql://server_host:3306/database?tinyInt1isBit=false
顺便说一句,你现在还可以使用t他length属性是这样的:
@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
非常感谢你的兄弟! – 2013-04-05 03:26:11
由于MySQL将'BOOLEAN'替换为'TINYINT(1)',所以也可以使用'columnDefinition =“BOOLEAN”',它可能更具可读性。 – eggyal 2013-09-26 09:29:10
你是对的,你也可以使用MySQL的BOOLEAN别名,只要别名被设置为TINYINT,现在就是这样。 顺便说一下,BOOLEAN和TINYINT都不是标准的SQL数据类型,所以如果您更改数据提供者方言(例如:Oracle),就会冒失败的风险。 – Donatello 2014-01-27 14:16:03
我有这个错误:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/context-config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: org.hibernate.type.NumericBooleanType, at table: bookingItem, for columns: [org.hibernate.mapping.Column(enabled)]
而这个工作对我来说:
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
我使用JPA与Spring数据/休眠5.0一个MySQL数据库。
在我的实体对象,我把以下内容:
@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;
我的开发环境具有休眠自动DDL集更新,所以当我部署到dev的,它创建的表类型TINYINT的列名( 1)。
我使用这个列的代码认为null为false,所以我不担心null,如果是的话,你可以使它成为一个原始的布尔值或者添加“,nullable = false”给Column注解。
此解决方案完全是JPA(不使用hibernate Type注释),并且不需要更改连接字符串。
工作正常,但更改位(1)为int – zaletniy 2012-03-22 12:48:11
-1后,但仅因为@Dude answer更好。 – Johan 2013-02-22 18:14:56
这是否也适用于布尔对象? – Rafael 2015-03-09 12:27:32