Para los atributos del tipo java.util.Locale, OpenJPA crea una columna de tipo VARCHAR(254), mientras que EclipseLink crea una columna de tipo BLOB(64000) LOGGED NOT COMPACT.
En EclipseLink, esta diferencia causa una java.io.CharConversionException
cuando hace referencia a una columna Locale creada por OpenJPA.
Para utilizar el atributo Locale de la misma manera que OpenJPA, utilice un convertidor de tipo de persistencia Java en EclipseLink.
Esta regla señala atributos del tipo java.util.Locale que no son transitorios y no tienen aún un convertidor.
Para migrar manualmente este problema, siga estos pasos:
Converter similar a la clase que se muestra en el ejemplo siguiente.java.util.Locale con la anotación @Convert y establezca el atributo convertidor a la clase de convertidor que ha creado.
Por ejemplo, esta regla señala el atributo Locale en la clase de entidad siguiente:
import java.util.Locale; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class LocaleEntity{ @Id private int id; private Locale localeField; } |
Cree una clase de convertidor.
El ejemplo siguiente muestra una clase de convertidor de tipo de ejemplo para java.util.Locale.
import java.util.Locale; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class LocaleConverter implements AttributeConverter<Locale, String> { public String convertToDatabaseColumn(Locale val) { return val.getLanguage() + "_" + val.getCountry() + "_" + val.getVariant(); } public Locale convertToEntityAttribute(String str) { if (isNullOrEmpty(str)) return null; String[] params = str.split("_", 3); if (params.length < 3) return null; return new Locale(params[0], params[1], params[2]); } private boolean isNullOrEmpty(String str) { return str==null || str.isEmpty(); } } |
Anote el atributo Locale con la anotación @Convert.
import java.util.Locale; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class LocaleEntity{ @Id private int id; @Convert(converter=LocaleConverter.class) private Locale localeField; } |
Si desea más información sobre este problema y otros problemas de migración de OpenJPA a EclipseLink, consulte la guía Migración de OpenJPA a EclipseLink JPA: Correlaciones.