2010-08-01 138 views
36

这里是我的JPA2/Hibernate的定义:Hibernate的JPA,MySQL和TINYINT(1)布尔代替位或字符

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

在MySQL此列被解析为一个位(1)数据类型 - 这不不适合我。对于遗留问题,我需要将布尔值映射到tinyint。但我没有看到更改默认数据类型的可能性。有没有?

回答

31

尝试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)")可以在没有任何数据库更改的情况下工作。

+0

工作正常,但更改位(1)为int – zaletniy 2012-03-22 12:48:11

+0

-1后,但仅因为@Dude answer更好。 – Johan 2013-02-22 18:14:56

+0

这是否也适用于布尔对象? – Rafael 2015-03-09 12:27:32

48

@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; 
+0

非常感谢你的兄弟! – 2013-04-05 03:26:11

+3

由于MySQL将'BOOLEAN'替换为'TINYINT(1)',所以也可以使用'columnDefinition =“BOOLEAN”',它可能更具可读性。 – eggyal 2013-09-26 09:29:10

+0

你是对的,你也可以使用MySQL的BOOLEAN别名,只要别名被设置为TINYINT,现在就是这样。 顺便说一下,BOOLEAN和TINYINT都不是标准的SQL数据类型,所以如果您更改数据提供者方言(例如:Oracle),就会冒失败的风险。 – Donatello 2014-01-27 14:16:03

1

我有这个错误:

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; 
1

我使用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注释),并且不需要更改连接字符串。