web-dev-qa-db-ja.com

Hibernate JPA、MySQL、TinyInt(1)、bitまたはcharの代わりにブール値を使用

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

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

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

44
Ta Sas

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

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

これはINTEGER型にマップされますが、TINYINTでおそらくうまく機能します。

更新:_org.hibernate.type.NumericBooleanType_はnotが一部のRDBMSでTINYINTで動作します。データベースの列タイプをINTEGERに切り替えます。または、別のJava @Type値、またはcolumnDefinitionを適宜使用します。

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

37
Mike Q

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

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

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

nb:この場合、長さ属性は効果がないようであるため、(1)構文を使用します。


Hibernate 4.0 +を使用すると、この種の構文は次のような実行時エラーを引き起こす可能性があります。

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

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

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

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

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

MySQLデータベースでJPAとSpring Data/Hibernate 5.0を使用しています。

私のEntityオブジェクトには、次のものを入れました。

@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;

私の開発環境では、hibernate auto-ddlがupdateに設定されているため、devにデプロイすると、tinyint(1)型のcolumn_nameでテーブルが作成されました。

この列を使用する私のコードはnullをfalseとみなしますので、nullを心配していません。もしあなたがそれをプリミティブなブール値にしたり、Columnアノテーションに「、nullable = false」を追加したりできます。

このソリューションは完全にJPA(hibernate Typeアノテーションを使用しない)であり、接続文字列を変更する必要はありません。

3

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

原因: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;
2
marioarranzr

Microsoft SQLと一部のバージョンのmysqlを使用する場合、次を使用します。

@Column(name = "eanbled", columnDefinition = "bit default 0", nullable = false)
private boolean enabled;

私にとって、tinybit、boolean、およびその他のそのような定義は失敗しました。

0
Nox