将 tinyint 映射为布尔休眠
Posted
技术标签:
【中文标题】将 tinyint 映射为布尔休眠【英文标题】:Map a tinyint as boolean hibernate 【发布时间】:2011-12-23 17:56:37 【问题描述】:我在 mysql 表 (TINYINT(1)) 中有一个 BOOLEAN 类型,我正在尝试将布尔字段映射到实体中,但这会产生异常:
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: boolean
我将实体中的字段更改为字节并进行相应的更改,使其成为布尔值,我得到:
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
【问题讨论】:
可能是一些有用的信息here。 @alvinbaena:下面有正确答案吗?? 我认为这是一个重复的问题,已在此处回答:***.com/questions/3383169/… 【参考方案1】:从我在这里读到的:
org.hibernate.HibernateException:maegul.users 中列管理员的列类型错误。找到:位,预期:整数
Hibernate 似乎期待一个整数并且得到了一点。
这意味着您的注释现在是正确的:
@Type(type = "org.hibernate.type.NumericBooleanType")
但也许它已将您的数据库更新为设置为位而不是整数,因此出现错误。
如果你真的需要一个 TinyInt,你可以使用 @Type
AND @Column
,设置为 Integer,类型为 TinyInt:
@Column(columnDefinition = "TINYINT")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean admin = true;
【讨论】:
我已经有一段时间没有问这个问题了,这个问题相关的项目早就丢失了。我真的不记得我是如何解决这个问题的,但鉴于有些人认为这个答案是合适的,我会接受它。 是的。我有同样的错误,但我的专栏是bit
。我使用了这个解决方案,但在columnDefinition
中使用BIT
而不是TINYINT
并且它有效。【参考方案2】:
最好使用BIT(1)
而不是TINYINT(1)
@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;
【讨论】:
【参考方案3】:您可以从方言中做到这一点,不需要在所有地方进行繁琐的 col 级别注释:
import org.hibernate.Hibernate;
import org.hibernate.dialect.PostgreSQLDialect;
import java.sql.Types;
public class PostgresCustomConversionDialect extends 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";
然后在-“hibernate.dialect”中使用这个自定义方言作为postgres方言
【讨论】:
【参考方案4】:试试这个:
<property name="isPaymentReceived" type="java.lang.Boolean">
<column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>
【讨论】:
【参考方案5】:我能够通过将“transformedBitIsBoolean=true”添加到我的 MySQL 连接字符串来解决此问题。
看到这个问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade
还有这个论坛帖子:https://hibernate.atlassian.net/browse/HHH-6935
【讨论】:
【参考方案6】:将其映射为 int 并使用访问器 (isAdmin) 获取布尔值有什么问题。无论如何,我希望你掩盖了实际的类型。
【讨论】:
【参考方案7】:将其映射为 org.hibernate.type.BooleanType 可能会起作用。
见http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-value-basic。
【讨论】:
不,仍然不工作给出了相同的异常,就好像它是一个没有注释的布尔值【参考方案8】:我今天在使用 hibernate 时遇到了类似的情况,最后将 mysql 数据类型设为 tinyint(1) 并将 hibernate 类型声明为布尔值,它成功了
【讨论】:
【参考方案9】:@Type 注解是休眠注解 要与 JPA 一起使用,可以使用 ColumnDefiniton 属性。
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;
【讨论】:
【参考方案10】:试试这个。
将您的列定义为 bit(1)
CREATE TABLE test_table (bool_column BIT(1));
将实体属性定义为布尔值
像这样映射属性
@Column(name = "bool_column", columnDefinition = "BIT")
public boolean boolField;
我认为这种方式更简单,而且你坚持 jpa 标准。
我有这个使用 MySQL 和 Hibernate 5。【讨论】:
以上是关于将 tinyint 映射为布尔休眠的主要内容,如果未能解决你的问题,请参考以下文章
为啥 MySQL 将布尔值解释为 TINYINT(1) 而不是 BIT(1)?
如何将 Postgresql 布尔值转换为 MySQL Tinyint?