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

Jon*_*nik 32 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)
Run Code Online (Sandbox Code Playgroud)

JPA @Entity@Column注释用于域对象,有问题的字段如下所示:

@Column(name = "Checked")
private boolean checked;
Run Code Online (Sandbox Code Playgroud)

HSQL架构:

Checked bit default 0 not null,
Run Code Online (Sandbox Code Playgroud)

MySQL架构:

`Checked` tinyint(1) NOT NULL default '0',
Run Code Online (Sandbox Code Playgroud)

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

我不知道代码和配置之前是否完全"正确",但至少它与Hibernate 3一起运行良好.

bab*_*ith 46

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

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

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

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

  • Hibernate版本4.3.0+不再需要 (2认同)

小智 19

我有同样的问题,我扩展了Dialect,考虑到mysql将boolean视为bit的别名这一事实.

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

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

  • 这似乎是Hibernate的MySQL方言中的另一个与类型相关的大疏忽.当4.0发布时我推迟升级,我很惊讶它一年后没有得到解决.但感谢小费.扩展方言和更新persistence.xml似乎比我在注释布尔字段时添加columnDefinition要好得多.我正在使用Hibernate作为JPA实现,并且我希望将非配置位保持为尽可能实现中立. (2认同)
  • 最后应该在下一个版本(4.3.0)中更正:https://hibernate.atlassian.net/browse/HHH-6935 (2认同)

Mat*_*tke 9

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