2012-10-22 8 views
13

をnullにブール値を設定することはできません、私は電話をしようとしたとき、私は、アプリケーションが、私はこの値を使用して、次の変数</p> <pre><code>@Column(columnDefinition = "bit") private boolean atShop; </code></pre> <p>を持つクラスのショップを持っている

from Person person 
left join fetch person.shop 

からこの情報を取得するにはHSQLを使用していますこのHSQL声明私はそれを設定しようとしているので、これを投げている

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop 

次のエラーを取得しますブール値はHSQLのnullになります。私はprivate Boolean atShop;からprivate boolean atShop;を変更することで、この問題を解決することができますが、私は私のデータベース

のビットとしてそれを保存していますように私はBooleanbooleanを変更することなく、これを解決する方法はありbooleanとして、これを維持したいですか?

EDIT:

私はブール値だけ真/偽とブールことができることを知っているが、nullに設定することができますが、私は思っている(この値をfalseに設定する/春休止状態を取得する方法がありますそれをnullに設定してこの例外をスローするのではなく、自動的に行う必要があります)。

は、私はまた、注釈が自動的に値をfalseに設定して追加しようとしたが、これはどちらか

@Column(nullable = false, columnDefinition = "bit default 0") 
private boolean atShop; 
+1

はい私はブール値とブール値の違いを知っていますが、春/休止状態がfalseの代わりにnullに設定しようとしているので、私のアプリケーションでこの例外がスローされています。 –

+3

ええ、私は人々が何の説明もせずに答えをdownvoteときだけ彼らは彼らが探しているものではないので嫌いです。何よりも、もともと十分にはっきりしていなかったこのような質問の中で。それは私を助けようとする私の意志を失う。 –

+0

@Edwin Dalorzo:それは私が私がすでにブールとブールの違いを理解していることを説明していないという私のせいであったので、答えを投票したのは私ではなく、編集セクションを私の質問に追加したものです。 –

答えて

28

動作しません -booleanプリミティブ型ある、とだけtrue or falseの値を持つことができます。

- Boolean一方ラッパーオブジェクトあり、ヌル値を与えることができます。

- あなたはブール値の代わりにブールたい場所でこれを行うことができますので、単純な代入演算子=)とブールブールに、バックブール値を変換するすることができますので、Java 1.5AutoBoxingからが提供されます。

1

booleantrueまたはfalseとなり、デフォルトはfalseとなります。 nullを取得するには、オブジェクトタイプはBooleanです。

10

休止状態のコードではなく、テーブル定義をデフォルトのNULL値に変更してfalse(または0)にします。あなたは、データベースから読み取るために来たときにその方法は、それは常に

+0

私はテーブルの列をデフォルト値に更新しようとしました0( 'ALTER TABLE Shop ALTER COLUMN atShopビットNOT NULL DEFAULT(0)')でも同じエラーが発生します –

+0

現在保存している値はすべて修正する必要があります。カラムもNOT NULLに設定する必要があります。 – DaveRlz

+0

テーブルからカラムを完全に削除して、 'ALTER TABLE Shop Shopbit NOT NULL DEFAULT(0)'を追加しました。すべての値が0に設定されていてもすべてが正常に表示されてもエラーは表示されます –

3

nullfalseと同じではありません(またそれがtrueと同じである)(、それはブール値なので、より多くの意味があります)有効な値を持つことになります。 nullは非常に特殊な意味を持ちます。だからこそ、Hibernateはそれが何をしているのかということです。なぜなら、それは本当に唯一のことなので、あなたが考えるべきことにもかかわらずです。

これらの列のnullをfalseとして扱うようにHibernateに指示する場合、唯一の実際の解決策は、この「nullは実際にはnullではありません」という特殊な処理のためのカスタムHibernate型マッピングを開発することです。 org.hibernate.type.Typeインターフェイスまたはorg.hibernate.usertype.UserTypeインターフェイスを実装することで、これを達成できます。最善の方法は、標準ブール型マッピングを拡張し、特別なnull処理を組み込むことです。

しかし、nullとの等価性のチェックはANSI SQLでは決して有効ではないので注意が必要です。これは、SQLがUNDEFINEDと呼ぶものに解決されます。通常はFALSEを意味します。

0

nullを意味する例外をスローするとtry catchを置くことができます。したがって、falseに設定します。

+0

割り当てが行われたコードを制御している場合には動作しますが、この場合、OPはHibernateから値を取得します。これはすべての割り当てとマッピングを行います。上記のSteve Ebersoleの答えに言及されているように、これは実際には選択肢ではありません – StormeHawke

関連する問題

 関連する問題