将tinyint映射为布尔值hibernate

时间:2011-11-07 15:55:57

标签: java mysql hibernate types

我在MySQL表中有一个BOOLEAN类型(TINYINT(1)),我试图在实体中映射布尔字段,但这会产生异常:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: boolean

我将实体中的字段更改为byte并进行相应的更改,使其成为布尔值,我得到:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: tinyint

我尝试在字段上使用@Type注释:

@Type(type = "org.hibernate.type.NumericBooleanType")

但我明白了:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: integer

10 个答案:

答案 0 :(得分:36)

从我在这里读到的内容:

  

org.hibernate.HibernateException:列管理员的maegul.users中的列类型错误。找到:bit,expected:integer

似乎Hibernate期待一个整数并且有点了。

这意味着您的注释现在正确无误:

@Type(type = "org.hibernate.type.NumericBooleanType")

但也许它已将您的数据库更新为设置为Bit而不是整数,因此错误。

如果你真的需要TinyInt,你可以使用@Type AND @Column来设置TinyInt类型的整数:

@Column(columnDefinition = "TINYINT")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean admin = true;

答案 1 :(得分:7)

更好地使用BIT(1)代替TINYINT(1)

@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;

答案 2 :(得分:2)

试试这个:

  <property name="isPaymentReceived" type="java.lang.Boolean">
  <column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>

答案 3 :(得分:1)

我能够通过在我的MySQL连接字符串中添加“transformedBitIsBoolean = true”来解决这个问题。

请参阅此问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade

此论坛帖子:https://hibernate.atlassian.net/browse/HHH-6935

答案 4 :(得分:1)

你可以从Dialect那里做到这一点,不需要在所有地方进行繁琐的col级别注释:

import org.hibernate.Hibernate;

import org.hibernate.dialect.PostgreSQLDialect;

import java.sql.Types;

公共类PostgresCustomConversionDialect扩展了PostgreSQLDialect {

public PostgresCustomConversionDialect() {
    super();
    this.registerColumnType( Types.BIT, "numeric(1, 0)" );
    this.registerColumnType( Types.BOOLEAN, "numeric(1, 0)" );
}

public String toBooleanValueString(boolean bool) {
    return bool ? "1" : "0";
}

}

然后在-&#34; hibernate.dialect&#34;

中使用这种自定义方言作为postgres方言

答案 5 :(得分:0)

将其映射为int并使用访问器(isAdmin)获取布尔值有什么问题。我希望你无论如何都会模糊实际的类型。

答案 6 :(得分:0)

将其映射为org.hibernate.type.BooleanType可能有效。

请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-value-basic

答案 7 :(得分:0)

我今天遇到了与hibernate类似的情况,最终将mysql数据类型作为tinyint(1)并将hibernate类型声明为boolean并且它完成了这个技巧

答案 8 :(得分:0)

@Type注释是hibernate注释 要与JPA一起使用,可以使用ColumnDefiniton Attribute。

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;

答案 9 :(得分:0)

尝试一下。

将您的列定义为bit(1)

CREATE TABLE test_table (bool_column BIT(1));

将您的实体属性定义为布尔值

这样映射属性

@Column(name = "bool_column", columnDefinition = "BIT")
public boolean boolField;

我认为这种方式更简单,而且您坚持使用jpa标准。

我已经在MySQL和Hibernate 5中使用了它。