Lo que me gusta, me interesa y me motiva…
RSS icon Home icon
  • Mapear enums en tablas usando FieldConversion de OJB

    Necesitaba mapear Enumeradores a la base de datos, esto en un proyecto que utiliza Apache ObJectRelationalBridge – OJB para el mapeo de los objetos en la base de datos.

    OJB permite definir tus propios conversores implementando FieldConversion

    import java.io.Serializable;
    import org.apache.ojb.broker.accesslayer.conversions.*;
    import org.apache.ojb.broker.accesslayer.conversions.FieldConversion;
     
    /**
     * Field Conversion para enum's
     * @author peiretti
     */
    public class SimpleEnumsFieldConversion implements FieldConversion, Serializable {
     
        private static final long serialVersionUID = 1L;
     
        private final String SEPARATOR = ":";
     
        /**
         * Recibe el enum de java y lo convierte a un String para guardarlo en la tabla
         */
        public Object javaToSql(Object source) throws ConversionException {
     
            if (!source.getClass().isEnum()) {
                throw new ConversionException("No se pudo convertir " + source.getClass().getName() + " no es un enumerador ");
            }
     
            Enum e = (Enum) source;
     
            // guardo el nombre de la clase : la constante del enumerador
            String valueToSql = source.getClass().getName() + SEPARATOR + e.name();
     
            return valueToSql;
     
        }
     
        /**
         * Recibe el String guardado y devuelve el enum de java
         */
        public Object sqlToJava(Object source) throws ConversionException {
     
            if (!(source instanceof String)) {
                throw new ConversionException("No se pudo convertir " + source.getClass().getName());
            }
     
            // contiene -> paquete.MiEnum:CONSTANTE
            String[] value = source.toString().split(SEPARATOR);
     
            // creo la clase a partir del valor que esta antes del separador :
            Class cl;
            try {
                cl = Class.forName(value[0]);
            } catch (ClassNotFoundException e) {
                throw new ConversionException("No se pudo convertir " + source);
            }
     
            if (!cl.isEnum()) {
                throw new ConversionException("No se pudo convertir " + source + " no es un enumerador");
            }
     
            // busco la constante almacenada
            Object[] o = cl.getEnumConstants();
            for (Object constant : o) {
                if (constant.toString().equals(value[1])) {
                    return constant;
                }
            }
            throw new ConversionException("No se pudo convertir " + source);
        }
    }

    Suponiendo que tienes un enum así

    //--
    public enum Tipo {
    	TIPO_UNO, TIPO_DOS, TIPO_TRES;
    }
    //--

    Ejecutando un pequeño test obtendrías esto:

    //--
    public static void main(String[] args) {
            SimpleEnumsFieldConversion simple = new SimpleEnumsFieldConversion();
            Object valorAGuardar = simple.javaToSql(Tipo.TIPO_DOS);
            System.out.println(valorAGuardar);
            //   gp.Tipo:TIPO_DOS
            System.out.println(simple.sqlToJava(valorAGuardar));
            //   TIPO_DOS
    }
    //--


    El field descriptor del repository_user.xml  de OJB quedaría así para tu atributo.

    <field-descriptor
    name=”tuAtributoEnElBean”
    column=”tuAtributoEnLaTabla”
    jdbc-type=”VARCHAR”
    conversion=”tuPaquete.SimpleEnumsFieldConversion “/>