8

JPA TopLink を使用して、 Javaのエンティティの列挙属性のnull値をOracleデータベースに格納しようとしています。コードは例外や警告なしで実行されますが、エンティティはデータベースに保存されません。

エンティティは次のように定義されます。

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

Enum クラス DocDeliveryTypeEnum には、必須の値しかありません。

public enum DocDeliveryTypeEnum {
    NORMAL,
    RECOMMENDED,
    ACKNOWLEDGEMENT
}  

私の状況では、deliveryType が意味を成し、必須であるエンティティのインスタンスがあります。ただし、場合によっては、 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 クラスでデフォルト値を作成する必要はありますか?

特定の状況ではあまり意味のないデフォルト値を設定することで、問題を解決しました。とはいえ、他に選択肢はないのだろうか。

貴重なご経験とアドバイス、誠にありがとうございます。

4

2 に答える 2

1

null 値を enum に保存しようとしているため、コードは NullPointerException をスローする必要があります。name が null の場合、Enum.valueOf() メソッドは NullPointerException をスローします。

let.setDeliveryType(null);

于 2013-09-13T05:05:37.170 に答える
1

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

どうすれば何も得られないのかわかりません。キャッチしていない例外が発生していますか?

最高級のログを有効にし、ログとコードを含め、例外をキャッチしてスタック トレースを含めます。

于 2012-07-11T13:49:09.033 に答える