2012-10-22 81 views
13

我有一個類店鋪有以下變量不能設定布爾爲空

@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中的布爾值爲空。我可以通過改變private boolean atShop;private Boolean atShop;解決這個問題,但我想保持這種作爲boolean,因爲我將其保存爲我的數據庫

有點是否有解決這個不改變booleanBoolean的方法嗎?

編輯:

我知道布爾值只能是真/假和布爾可以設置爲空,但有沒有辦法讓休眠/春將該值設置爲false(我認爲它應該自動)而不是試圖將其設置爲null並拋出此異常?

我也嘗試添加註釋的值會自動設置爲false但是,這並不工作,要麼

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

是的,我知道,我的應用程序拋出這一例外,因爲春/ Hibernate是試圖建立atShop爲null,而不是虛假的布爾和布爾之間的差異,但我怎樣才能得到它設置爲false和not null? –

+3

嘖嘖,我討厭人們在沒有任何解釋的情況下回答問題的答案,只因爲他們不是他們正在尋找的東西。最重要的是,像這樣的問題本來不夠清楚。這讓我失去了嘗試幫助的意願。 –

+0

@Edwin Dalorzo:但是這不是我是誰投下來的答案,這就是爲什麼我添加了編輯部分我的問題,因爲這是我的錯,我沒有解釋,我已經明白布爾和布爾 –

回答

28

-boolean基本類型,並且可以只true or false值。

-Boolean包裝對象,可以給予值。

-Java 1.5AutoBoxing提供,這樣你就可以轉換布爾布爾再換用簡單的賦值操作符=)爲布爾值,所以,你可以在你想要的,而不是布爾布爾地做到這一點。

1

boolean是原始的,它可能是truefalse,默認爲false。要獲得null,它的對象類型是Boolean

10

而不是擺弄hibernate代碼,將您的表定義更改爲默認空值爲false(或0)。這樣,當你從數據庫中讀取它總是有有效值(其中,因爲它是布爾值,更有意義)

+0

我試圖更新表中的列以使其具有默認值0('ALTER TABLE店 ALTER COLUMN atShop位NOT NULL DEFAULT(0)'),但我仍然得到同樣的錯誤 –

+0

你可能需要解決您目前保存的所有值,它們將是空的。您應該將列設置爲NOT NULL。 – DaveRlz

+0

我最終完全丟棄從表中的列,並使用'ALTER TABLE店 ADD atShopbit NOT NULL DEFAULT加回(0)'和即使所有的值設置爲0,一切正常的錯誤仍然出現 –

3

null是不一樣的false(也不是一樣true)。 null有非常具體的含義。這就是爲什麼Hibernate能夠做到這一點......因爲儘管你認爲它應該做,但它確實是唯一有意義的東西。

如果您希望指示Hibernate將這些列中的null視爲false,唯一真正的解決方案是開發一個定製的Hibernate類型映射,以對「null不是真的爲null」進行特殊處理。您可以通過執行org.hibernate.type.Type接口或org.hibernate.usertype.UserType接口來實現。最好的辦法是擴展標準的布爾類型映射,並在特殊的空值處理中編織。

有一點要小心,但是,因爲檢查的平等對抗null查詢從來沒有在ANSI SQL有效。它解決了什麼SQL調用UNDEFINED,這通常意味着FALSE

0

你知道你可以只放一個嘗試捕捉圍繞它,如果它拋出一個異常,這意味着它是空,因此將其設置爲false。

+0

如果你在代碼控制中完成賦值工作,那麼這很有效,但在這種情況下,OP從Hibernate獲取值,它會爲你做所有的賦值和映射,所以如果沒有爲Hibernate實現他自己的Type處理程序,在上面Steve Ebersole的回答中提到,這不是一個真正的選擇 – StormeHawke