我在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
答案 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
答案 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中使用了它。