2012-07-11 62 views
5

我想在的Java存儲實體的列舉屬性的使用的Oracle TopLink的JPA數據庫。代碼沒有例外或警告地執行,但實體未存儲在數據庫中。是否可以將枚舉屬性的空值存儲到數據庫中?

實體定義如下:

@Entity 
public class LetterDoc { 
    ... 
    @Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true) 
    @Enumerated(EnumType.STRING) 
    private DocDeliveryTypeEnum deliveryType; 
    ... 
} 

的枚舉類DocDeliveryTypeEnum只所需的值。

public enum DocDeliveryTypeEnum { 
    NORMAL, 
    RECOMMENDED, 
    ACKNOWLEDGEMENT 
} 

在我的情況下,我有實體的情況下deliveryType使sence和必需的實例。但是,在某些情況下,deliveryType爲無關,我想離開它null。我不想設置默認值,因爲這種情況下沒有足夠的值。

實體實例的值設置爲null,但是當我嘗試持久化並刷新數據庫中的實例時,它只是未被存儲,儘管該列被定義爲啓用了NULL值的VARCHAR2(20)。

的情況是這樣的:

LetterDoc let = new LetterDoc(); 
// settery ostatnich atributu 
let.setDeliveryType(null); 
try { 
    emptyDocDAO.persist(let); 
    emptyDocDAO.flush(); 
} catch (Exception e) { 
    // no exception is really catched :(
    log.error(e); 
} 
// here I have the id of the entity 

真的沒有異常,而堅持,不僅僅是實體不存儲拋出。當我試圖通過ID在另一個線程中獲取實體時,它會因NoResultException而失敗。

有沒有機會做這項工作,還是我真的必須在持續之前爲所有枚舉屬性設置一個值?我真的必須在Enum類中創建一個默認值嗎?

我已經通過設置在特定情況下沒有多大意義的默認值解決了我的問題。不過,我想知道是否有其他選擇。

非常感謝您的經驗和建議。

+2

它應該能夠在列中保存空值。在試圖執行的代碼中顯示代碼,以及獲取的異常的完整堆棧跟蹤。 – 2012-07-11 09:37:22

+0

在你試用這個枚舉成員:columnDefinition =「char(20)默認'NULL'」 – shem 2012-07-11 09:41:58

+0

@JBNizet:我真的沒有得到任何異常。這是我最想知道的:( – Sharg 2012-07-12 13:26:48

回答

1

是的,你可以爲null枚舉屬性存儲。

我看不出你怎麼可以什麼都得不到,是一個異常發生,你沒有捕捉?

啓用最好的日誌記錄幷包含日誌和代碼,並捕獲任何異常幷包含堆棧跟蹤。

+1

我增加了一些代碼來展示我如何存儲實體。但是,即使在捕獲異常時,也不會引發和捕獲:( – Sharg 2012-07-12 13:27:51

0

當您嘗試將空值保存爲枚舉時,代碼應拋出NullPointerException。 如果name爲null,則Enum.valueOf()方法將拋出NullPointerException。

let.setDeliveryType(null);

相關問題