22

次の変数を持つクラス Shop があります

@Column(columnDefinition = "bit")
private boolean atShop;

この値を使用して、HSQL を使用してアプリケーションからこの情報を取得しています

from Person person
left join fetch person.shop

この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;これを保持したいと思いますboolean

booleanに変更せずにこれを解決する方法はありBooleanますか?

編集:

ブール値はtrue/falseにしか設定できず、ブール値はnullに設定できることはわかっていますが、休止状態/春にこの値をfalseに設定する方法はありますか(これは自動的に行うべきだと思いました) null とこの例外をスローしますか?

値を自動的にfalseに設定する注釈を追加しようとしましたが、これも機能しません

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

6 に答える 6

41

- booleanプリミティブ型であり、値は。のみtrue or falseです。

-これBooleanラッパーオブジェクトであり、 null値を指定できます。

--FromJava 1.5 AutoBoxingが提供されているため、単純代入演算子( )を使用してブール値をブール値に変換し、ブール値に戻すことができます。=したがって、ブール値の代わりにブール値が必要な場所でこれを行うことができます。

于 2012-10-22T14:12:14.833 に答える
10

休止状態のコードをいじるのではなく、テーブル定義をデフォルトの null 値に変更して false (または 0) にします。そうすれば、データベースから読み取るようになると、常に有効な値が得られます(これはブール値であるため、より理にかなっています)

于 2012-10-22T14:28:24.397 に答える
4

nullと同じではありませんfalse(または と同じでもありませんtrue)。 null非常に具体的な意味があります。それが、Hibernate がその機能を実行する理由です...なぜなら、Hibernate がすべきと考えていることにもかかわらず、それが本当に唯一の理にかなっているからです。

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

nullただし、 ANSI SQL では同等性をチェックすることはできないため、クエリには注意が必要です。これは、SQL が呼び出すものに解決されます。UNDEFINEDこれは通常、 を意味しFALSEます。

于 2012-10-22T15:39:03.890 に答える
1

booleanプリミティブはtrueまたはfalseであり、デフォルトは ですfalse。を取得するnullには、そのオブジェクト タイプはBooleanです。

于 2012-10-22T14:13:41.377 に答える