Gustavo Peiretti
Lo que me gusta, me interesa y me motiva…
-
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 “/>

