Datanucleus (JDO) – Mapear una propiedad Boolean a un Char

Un tipo de propiedad que encontramos comunmente en nuestros objetos es el tipo Boolean. Puede ser para describir si un registro esta activo o no, o para marcar una tarea como realizada, etc. En una base de datos no es común encontrar este tipo de dato para una columna. Normalmente lo representamos mediante un Number(‘0’ o ‘1’) o un Char (‘S’ o ‘N’). En nuestro caso utilizamos el Char.

Al utilizar Datanucleus con JDO para mapear la siguiente clase

@PersistenceCapable(table="TC_EMPLEADOS")
public class Empleado {
@PrimaryKey
@Persistent(column="NID")
Integer id;
@Persistent(column="SNOMBRE")
String nombre;
@Persistent(column="BACTIVO")
Boolean activo;
public Empleado() {
}

}

me arrojaba un error parecido al siguiente:

NucleusDatastoreException: Fail to convert to internal representation

El problema es que, por default, Datanucleus trata de mapear la propiedad «activo» a un valor númerico (‘0’ o ‘1’). Para mapear la propiedad a una cadena podemos hacer lo siguiente:

@PersistenceCapable(table="TC_EMPLEADOS")
public class Empleado {

@PrimaryKey
@Persistent(column="NID")
Integer id;

@Persistent(column="SNOMBRE")
String nombre;

@Persistent(column="BACTIVO")
String activo;

public Empleado() {
}

public Boolean getActiv0() {
   return "S".equals(activo);
}

public void setActivo(Boolean activo) {
   this.activo = activo?"S":"N";
}

}

Notesé que utilizamos el tipo String para la propiedad y Boolean para los métodos de acceso a la propiedad.

Fuentes:

http://turbomanage.wordpress.com/2009/12/04/persisting-enums-with-appengine-datastore/