2010-05-10 20 views
6

¿Cómo debo almacenar un Java Enum en JavaDB?¿Cómo debo almacenar un Java Enum en JavaDB?

¿Debería tratar de asignar las enumeraciones al SMALLINT y mantener los valores solo en el código fuente? La base de datos integrada solo es utilizada por una sola aplicación. ¿O debería simplemente almacenar los valores como DECIMAL? Ninguna de estas soluciones se siente bien/robusta para mí. ¿Hay alguna alternativa mejor?

Aquí es mi enumeración:

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; 
    } 
} 

He leído otras preguntas similares sobre este tema, pero el problema o la solución no coincide con mi problema. Enum storage in Database field, Best method to store Enum in Database, Best way to store enum values in database - String or Int

Respuesta

3

Mi preferencia es hacer de la siguiente manera:

  • Crear una tabla de enumeración dedicada en su base de datos con columnas: YourEnumId smallint, varchar YourEnumName (32).
  • Dentro de la tabla de objetos de negocio, agregue referencias de claves externas a la tabla de enumeraciones.
  • Implemente su DAO de Java para asignar valores enum a valores de la base de datos pequeños cuando persisten los datos O implemente procedimientos almacenados que acepten el nombre enum (es decir, varchar) y conviértalo en una pequeña letra al escribir los datos.

Ventajas

  • Aumento de normalización (y por tanto una menor carga de almacenamiento) en comparación con el almacenamiento el valor de cadena explcitly en la tabla de base de datos.
  • Sus datos de bases de datos no se verán dañados si sus java enumeración cambios de definición (por ejemplo, si cambiar el orden de los valores).
  • Su clase DAO puede fail-fast durante inicialización mediante la comprobación de que la definición enumeración de Java coincide con los contenido de la tabla YourEnum.
  • Puede proporcionar vistas en la base de datos que devuelven los valores enum de cadena (por ejemplo, si usted o un usuario desea consultar la tabla directamente).

Esto es similar a la solución de cletus, excepto que la codificación enum se almacena explícitamente en la base de datos en lugar de definirse como parte de la definición enum.

8

En JPA, tiene dos opciones:

  1. por su nombre;

  2. Por ordinal (integer).

No me gusta (2). Si cambias el orden de tu enumeración, se rompe. Como tal, es más común usar (1) (en mi experiencia).

Haría lo mismo en JavaDB. Simplemente almacene el nombre enum como texto. Tiene la ventaja de que puede mirar una fila y saber lo que significa en lugar de tratar de descubrir qué significa "3" en la columna status_id.

Si le preocupa el espacio (y el 99% del tiempo no lo estaría) utilice un número entero o use un código. Por ejemplo:

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

Gracias, esa fue una buena solución. Estaba pensando que tal vez me gustaría utilizar los valores en los cálculos SQL en el futuro, así que tal vez debería almacenar los valores en su propia tabla db. – Jonas