57

これが私のJPA2 / Hibernateの定義です:

Code:
@Column(nullable = false)
private boolean enabled;

MySql では、この列は bit(1) データ型に解決されますが、これはうまくいきません。レガシーの問題については、ブール値をビットではなく tinyint にマップする必要があります。しかし、デフォルトのデータ型を変更する可能性はありません。ありますか?

4

6 に答える 6

69

@Type アノテーションは Hibernate アノテーションです。

完全な JPA2 ( Hibernate 3.6+を使用) では、ブール型フィールドを BIT(1) ではなく TINYINT(1) SQL タイプにマップする方法は、 columnDefinition 属性を使用することです。

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;

注意: この場合、長さ属性は効果がないように思われるため、(1) 構文を使用します。


Hibernate 4.0+では、この種の構文により、次のようなランタイム エラーが発生する可能性があります。

Wrong column type Found: bit, expected: TINYINT(1)

この場合、唯一の方法は、次のように MySQL データソース接続文字列でtinyInt1isBit=falseを使用することです。

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false

ところで、次のように length 属性を使用できるようになりました。

@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
于 2012-04-19T09:06:45.190 に答える
45

を試してくださいNumericBooleanType。何らかの理由で、これには宣言された短い型名がないため、次を使用する必要があります。

@Column(nullable = false)
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean enabled;

これは INTEGER 型にマップされますが、おそらく TINYINT で問題なく動作します。

更新:一部の RDBMS では TINYINT ではorg.hibernate.type.NumericBooleanType機能しません。データベースの列の型を INTEGER に切り替えます。または、必要に応じて別の Java @Type 値または columnDefinition を使用します。

この例では、Dude の答えは@Column(nullable = false, columnDefinition = "TINYINT(1)")、データベースを変更しなくても機能します。

于 2010-08-01T19:22:18.020 に答える
2

私はこのエラーがありました:

原因: org.springframework.beans.factory.BeanCreationException: ServletContext リソース [/WEB-INF/config/context-config.xml] で定義された名前 'sessionFactory' の Bean を作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 次のタイプを特定できませんでした: org.hibernate.type.NumericBooleanType、テーブル: bookingItem、列: [org.hibernate.mapping.Column(enabled)]

そして、これは私のために働いた:

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
于 2015-08-06T11:29:47.283 に答える