33

我正在尝试从 Hibernate 3.6.5 升级到 4.0(以及从 Spring 3.0.5 升级到 Hibernate 4 支持所需的 3.1)。

现在,对于 MySQL 和 HSQL,我遇到了持久布尔字段的问题:

Caused by: org.hibernate.HibernateException: 
Wrong column type in PUBLIC.PUBLIC.EVENT for column Checked. Found: bit, expected: boolean
    at org.hibernate.mapping.Table.validateColumns(Table.java:282)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1268)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)

域对象中使用了JPA@Entity@Column注解,有问题的字段如下所示:

@Column(name = "Checked")
private boolean checked;

HSQL 架构:

Checked bit default 0 not null,

MySQL 架构:

`Checked` tinyint(1) NOT NULL default '0',

在坚持使用 Hibernate 4 的同时解决这个问题的最直接的方法是什么?我应该更改数据库架构、Hibernate 配置还是域类注释?

我不知道代码和配置之前是否完全“正确”,但至少它在 Hibernate 3 中运行良好。

4

5 回答 5

47

我通过添加columnDefinition = "BIT"到@Column 行来解决这个问题。

@Basic
@Column(name = "B", columnDefinition = "BIT", length = 1)
public boolean isB() {
    return b;
}

它也在数据库中定义为“BIT(1)”。还与 TINYINT 合作。这是我找到的最简单的解决方案,因为更改非常小,无需接触数据库。

使用:MySQL 服务器 5.5.13、Hibernate 4.1.1、JDK 1.6

于 2012-03-27T12:14:02.767 回答
20

我遇到了同样的问题,我扩展了方言以考虑到 mysql 将布尔值视为位别名的事实。

public class Mysql5BitBooleanDialect extends MySQL5Dialect{     
    public Mysql5BitBooleanDialect() {
        super();
        registerColumnType( java.sql.Types.BOOLEAN, "bit" );        
    }       
}

我不使用更长的 bit() 字段(例如表示 byte[]),所以这可能会破坏它。

于 2012-01-17T03:16:41.703 回答
10

我能够通过添加transformedBitIsBoolean=true到我的 MySQL 连接字符串来解决这个问题。见这里:https ://hibernate.atlassian.net/browse/HHH-6935

于 2014-03-05T14:19:59.080 回答
0

这已在此处的类似问题中得到解答:

Hibernate JPA、MySQL 和 TinyInt(1) 用于布尔而不是位或字符

当您同时使用 HSQL DB 时,您的问题可能会更复杂一些,但您可以看看并尝试一下!

于 2014-12-05T11:05:24.970 回答
-1

发现问题我也得到了 org.hibernate.HibernateException: Wrong column type ... 发现:位,预期:布尔

在休眠 4 中的 BooleanType 上,他们将 Ctor 更改为

public BooleanType() {
    this( org.hibernate.type.descriptor.sql.BooleanTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}

而不是旧版本

public BooleanType() {
    this( BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}
于 2012-01-04T14:33:20.010 回答