"发现:bit,expected:boolean"在Hibernate 4升级之后

时间:2011-12-29 12:37:23

标签: java mysql hibernate hsqldb hibernate-4.x

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

现在,对于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中运行良好。

5 个答案:

答案 0 :(得分:45)

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

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

它也被定义为DB中的'BIT(1)'。还与TINYINT合作。这是我发现的最简单的解决方案,因为更改是超小型的,无需触摸数据库。

使用:MySQL Server 5.5.13,Hibernate 4.1.1,JDK 1.6

答案 1 :(得分:19)

我有同样的问题,我扩展了Dialect,考虑到mysql将boolean视为bit的别名。

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:0)

发现问题 我也得到了org.hibernate.HibernateException:错误的列类型...发现:bit,expected:boolean

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

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

而不是旧版本

public BooleanType() {
    this( BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}

答案 4 :(得分:0)

这里有一个类似的问题回答:

Hibernate JPA, MySQL and TinyInt(1) for Boolean instead of bit or char

当您同时使用HSQL DB时,您的问题可能会有点复杂,但您仍然可以看看并尝试它!