【问题标题】:Map a tinyint as boolean hibernate将 tinyint 映射为布尔休眠
【发布时间】: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

【问题讨论】:

标签: java mysql hibernate types


【解决方案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。

                【讨论】:

                  猜你喜欢
                  • 2014-11-20
                  • 2011-09-05
                  • 1970-01-01
                  • 2011-04-30
                  • 2019-01-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多