web-dev-qa-db-ja.com

Hibernate 4アップグレード後の「見つかりました:ビット、期待:ブール値」

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では問題なく機能しました。

32
Jonik

@Column行にcolumnDefinition = "BIT"を追加してこれを解決しました。

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

DBでも「BIT(1)」と定義されています。 TINYINTとも連携。これは、変更が非常に小さなものであり、DBに触れる必要がないため、私が見つけた最も簡単なソリューションです。

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

45
baba smith

私は同じ問題を抱えていましたが、mysqlがブール値をビットのエイリアスとして扱うという事実を考慮に入れるように方言を拡張しました。

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

(たとえば、byte []を表すために)より長いbit()フィールドを使用しないので、これが壊れる可能性があります。

19
Michal Stawski

MySQLの接続文字列にtransformedBitIsBoolean=trueを追加することで、この問題を解決できました。ここを参照してください: https://hibernate.atlassian.net/browse/HHH-6935

9
Matthias Wuttke

これは同様の質問でここに答えられました:

ビットまたは文字ではなくブール値のHibernate JPA、MySQLおよびTinyInt(1)

同時にHSQL DBを使用するため、問題はもう少し複雑になる可能性がありますが、とにかく見て、試すことができます。

0
Donatello