2012-07-11 9 views
5

私はJPAのTopLinkを使用したJava へのOracleデータベース内のエンティティの列挙属性のヌル値を格納しようとしています。コードは例外または警告なしで実行されますが、エンティティはデータベースに格納されません。列挙された属性のNULL値をデータベースに格納することはできますか?

次のようにエンティティが定義されている:

@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が意味するエンティティのインスタンスがあり、必須です。ただし、場合によってはとは関係ないとなります。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

この列にはnullを保存できるはずです。あなたがそれをしようとするコードと、あなたが得る例外の完全なスタックトレースを表示します。 –

+0

これをあなたのenumメンバーで試してください:columnDefinition = "char(20)default 'NULL'" – shem

+0

@JBNizet:本当に例外はありません。それは私が最も不思議なことです:( – Sharg

答えて

1

はい、enum属性にnullを格納できます。

私はあなたが何も得ることができなかったのを見ることができません、あなたはキャッチしていない例外が発生していますか?

ログを有効にし、ログとコードを含め、例外をキャッチしてスタックトレースを含める。

+1

私はエンティティを格納する方法を示すためにいくつかのコードを追加しました。しかし、Exceptionをキャッチしても、何も投げられずにキャッチされません。 – Sharg

0

ヌル値をenumに保存しようとすると、コードによってNullPointerExceptionがスローされます。 名前がnullの場合、Enum.valueOf()メソッドはNullPointerExceptionをスローします。

let.setDeliveryType(null);

関連する問題