2010-05-10 9 views
6

Jak przechowywać Enum Java w JavaDB?Jak przechowywać enum Java w JavaDB?

Czy należy próbować odwzorować enumy na SMALLINT i zachować wartości tylko w kodzie źródłowym? Wbudowana baza danych jest używana tylko przez jedną aplikację. A może po prostu przechowywać wartości jako DECIMAL? Żadne z tych rozwiązań nie jest dla mnie dobre/solidne. Czy są jakieś lepsze alternatywy?

Oto mój enum:

import java.math.BigDecimal; 

public enum Vat { 
    NORMAL(new BigDecimal("0.25")), 
    FOOD(new BigDecimal("0.12")), 
    BOOKS(new BigDecimal("0.06")), 
    NONE(new BigDecimal("0.00")); 

    private final BigDecimal value; 

    Vat(BigDecimal val) { 
     value = val; 
    } 

    public BigDecimal getValue() { 
     return value; 
    } 
} 

Czytałem inne podobne pytania na ten temat, ale problem lub rozwiązanie nie pasuje do mojego problemu. Enum storage in Database field, Best method to store Enum in Database, Best way to store enum values in database - String or Int

Odpowiedz

3

Moje preferencje to zrobić w następujący sposób:

  • Tworzenie dedykowanego tabeli enum w bazie danych z kolumn: YourEnumId smallint, YourEnumName varchar (32).
  • W tabeli obiektów biznesowych należy dodać odwołania do kluczy obcych do tabeli wyliczeniowej.
  • Zaimplementuj Java DAO, aby odwzorować wartości wyliczeniowe na specyficzne dla bazy danych smallint wartości przy utrzymywaniu danych LUB zaimplementować procedury przechowywane, które akceptują nazwę wyliczeniową (tj. Varchar) i przetłumaczyć ją na smallint podczas zapisywania danych.

Zalety

  • Zwiększona normalizacja (a tym samym niższy narzut przechowywanie) w porównaniu z przechowywaniem wartość ciągu explcitly w tabeli bazy danych.
  • Dane baza nie będzie uszkodzony jeśli java enum zmiany rozdzielczości (na przykład jeśli zmienić kolejność wartości).
  • Twoja klasa DAO może fail-szybka podczas inicjalizacji zaznaczając, że definicja enum Java dopasowuje zawartość tabeli YourEnum.
  • Można wyświetlać widoki na bazie danych, które zwracają wartości wyliczenia ciągu (np. Jeśli użytkownik lub użytkownik chce bezpośrednio przetworzyć tabelę).

Jest to rozwiązanie podobne do rozwiązania cletusa, z tym że kodowanie enum jest zapisywane jawnie w bazie danych, a nie definiowane jako część definicji wyliczeniowej.

8

W JPA, masz dwie możliwości:

  1. z nazwy;

  2. Według liczby porządkowej (liczba całkowita).

Nie podoba mi się (2). Jeśli zmienisz kolejność wyliczania, ulegnie ona zerwaniu. Jako takie jest bardziej powszechne w użyciu (1) (z mojego doświadczenia).

Zrobiłbym to samo w JavaDB. Po prostu zapisz nazwę enum jako tekst. Ma tę zaletę, że można patrzeć na wiersz i wiedzieć, co to znaczy, a nie próbować dowiedzieć się, co oznacza "3" w kolumnie status_id.

Jeśli niepokoi Cię przestrzeń (i 99% czasu, w którym bym nie był), użyj liczby całkowitej lub użyj kodu. Na przykład:

public enum Vat { 
    NORMAL(new BigDecimal("0.25")), 
    FOOD(new BigDecimal("0.12")), 
    BOOKS(new BigDecimal("0.06")), 
    NONE(new BigDecimal("0.00")); 

    private static final Map<String, Vat> LOOKUP = new HashMap<String, Vat>(); 

    static { 
    Vat[] values = values(); 
    for (Vat vat : values) { 
     LOOKUP.put(vat.code, vat); 
    } 
    } 

    private final String code; 
    private final String value; 

    private Vat(String code, BigDecimal value) { 
    this.code = code; 
    this.value = value; 
    } 

    public String getCode() { return code; } 
    public String getValue() { return value; } 

    public Vat fromCode(String code) { 
    return LOOKUP.get(code); 
    } 
} 
+0

Dzięki, to było dobre rozwiązanie. Myślałem teraz, że może chciałbym użyć wartości w obliczeniach SQL w przyszłości, więc może powinienem zapisać wartości w ich własnej tabeli db. – Jonas