Java &引用;已找到:位,应为:布尔值;在Hibernate4升级之后

Java &引用;已找到:位,应为:布尔值;在Hibernate4升级之后,java,mysql,hibernate,hsqldb,hibernate-4.x,Java,Mysql,Hibernate,Hsqldb,Hibernate 4.x,我正在尝试从Hibernate3.6.5升级到4.0(以及从Spring3.0.5升级到3.1,这是Hibernate4支持所必需的) 现在,对于MySQL和HSQL,我遇到了持久布尔字段的问题: Caused by: org.hibernate.HibernateException: Wrong column type in PUBLIC.PUBLIC.EVENT for column Checked. Found: bit, expected: boolean at org.hib

我正在尝试从Hibernate3.6.5升级到4.0(以及从Spring3.0.5升级到3.1,这是Hibernate4支持所必需的)

现在,对于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)
HSQL模式:

Checked bit default 0 not null,
`Checked` tinyint(1) NOT NULL default '0',
MySQL架构:

Checked bit default 0 not null,
`Checked` tinyint(1) NOT NULL default '0',
在坚持使用Hibernate 4时,最简单的解决方法是什么?我应该更改数据库架构、Hibernate配置还是域类批注

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

发现了问题 我还得到org.hibernate.HibernateException:列类型错误。。。已找到:位,应为:布尔值

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

public BooleanType() {
    this( org.hibernate.type.descriptor.sql.BooleanTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}
而不是旧版本

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

我也有同样的问题,我扩展了方言,以考虑到mysql将布尔值视为bit的别名这一事实

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

我不使用更长的bit()字段(例如表示字节[]),因此这可能会打破这一点。

我通过在@Column行中添加
columnDefinition=“bit”
来解决这个问题

@Basic
@Column(name = "B", columnDefinition = "BIT", length = 1)
public boolean isB() {
    return b;
}
其在DB中也定义为“位(1)”。也曾与TINYINT合作。这是我发现的最简单的解决方案,因为更改非常小,不需要触摸数据库


通过使用:MySQL服务器5.5.13、Hibernate 4.1.1、JDK 1.6,我可以通过在MySQL连接字符串中添加
transformedBitIsBoolean=true
来解决这个问题。请参见此处:

此处的类似问题已经回答了这一问题:


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

对于HSQL,在模式文件中将“bit”更改为“boolean”似乎有帮助(即,我随后遇到了另一个Hibernate4问题)。这有点奇怪,因为给人的印象是布尔和位是等价的。那么解决方案是什么呢?引用我的问题:“在坚持使用Hibernate 4的同时,解决这个问题最简单的方法是什么?我应该更改数据库模式、Hibernate配置还是域类注释?”这不是问题的答案。这似乎是Hibernate MySQL方言中(另一个)与类型相关的大疏忽。4.0发布时我推迟了升级,我很惊讶一年后它还没有得到解决。但是谢谢你的提示。扩展方言并更新persistence.xml似乎比在任何时候注释布尔字段时添加columnDefinition要好得多。我使用Hibernate作为JPA实现,我希望尽可能保持非配置位与实现无关,但6个月后问题仍然存在。最糟糕的是,hibernate2ddl本身生成的模式将布尔值与MySQL结合使用。因此Hibernate无法验证Hibernate生成的模式:(最后应该在下一个版本(4.3.0)中对其进行更正):这比按位编码要好得多:-)对我有效(Hibernate 4.1.x)。因为对我来说,这里的含义并不明显:在Histbern.xml中:不再需要在Hibernate版本4.3.0+中解决这个问题——但是它不是根问题的修复——它是MySQL服务器本身——考虑将“TrimFrimeBiToBooLeIAN”标记添加到您的数据源URL中,如