2012-07-11 14 views
5

Próbuję zapisać zerową wartość na wyliczone atrybutem podmiotu w Java do Oracle bazy danych przy użyciu WZP TopLink. Kod jest wykonywany bez wyjątku lub ostrzeżenia, ale jednostka nie jest przechowywana w bazie danych.Czy jest możliwe zapisanie wartości pustej wyliczonego atrybutu w bazie danych?

Jednostka jest zdefiniowana w następujący sposób:

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

enum class DocDeliveryTypeEnum nie tylko wymagane wartości.

public enum DocDeliveryTypeEnum { 
    NORMAL, 
    RECOMMENDED, 
    ACKNOWLEDGEMENT 
} 

W mojej sytuacji mam wystąpienia jednostek, w których występuje parametr deliveryType i jest wymagany. Jednak w niektórych przypadkach deliveryType to nieistotne i chcę go zostawić null. Nie chcę ustawiać wartości domyślnej, ponieważ nie ma odpowiedniej wartości dla tego przypadku.

Instancja jednostki ma wartość ustawioną na wartość null, ale gdy próbuję kontynuować i wyczyścić instancję w bazie danych, nie jest ona przechowywana, chociaż kolumna jest zdefiniowana jako VARCHAR2 (20) z włączoną wartością NULL.

Sytuacja jest mniej więcej tak:

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 

Naprawdę nie jest wyjątek podczas utrzymującego, tylko jednostka nie jest przechowywana. Kiedy próbuję uzyskać encję później w innym wątku przez identyfikator, to kończy się niepowodzeniem z NoResultException.

Czy jest jakaś szansa na wykonanie tej pracy, czy naprawdę muszę ustawić wartość dla wszystkich wyliczonych atrybutów, zanim będzie trwała? Czy naprawdę muszę utworzyć domyślną wartość w klasie Enum?

Rozwiązałem mój problem, ustawiając domyślną wartość, która nie ma większego sensu w konkretnej sytuacji. Zastanawiam się jednak, czy jest jakaś inna opcja.

Bardzo dziękuję za Państwa radę i doświadczenie.

+2

Powinna być w stanie zapisać wartość zerową w kolumnie. Pokaż kod, w którym próbujesz to zrobić, i pełny ślad stosu wyjątku, który otrzymujesz. –

+0

spróbuj tego w swoim członku enum: columnDefinition = "char (20) default" NULL "" – shem

+0

@JBNizet: Naprawdę nie mam żadnego wyjątku. Właśnie o to się zastanawiam :( – Sharg

Odpowiedz

1

Tak, można zapisać wartość zerową dla atrybutu wyliczeniowego.

Nie widzę, jak można uzyskać tylko nic, czy jest wyjątek, że nie łapiecie?

Włącz rejestrowanie na najwyższym poziomie, dołącz dziennik i kod, przechwytuj wszystkie wyjątki i dołącz śledzenie stosu.

+1

Dodałem trochę więcej kodu, żeby pokazać, jak przechowuję encję.Jednak nawet przy wychwytywaniu wyjątku nic nie jest rzucane i chwytane :( – Sharg

0

Kod powinien rzucić wyjątek NullPointerException podczas próby zapisania wartości pustej do wyliczenia. Metoda Enum.valueOf() generuje wyjątek NullPointerException, jeśli nazwa ma wartość null.

let.setDeliveryType (null);

Powiązane problemy