我正在尝试从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中运行良好。
答案 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时,您的问题可能会有点复杂,但您仍然可以看看并尝试它!