Para atributos do tipo java.util.Locale,
OpenJPA cria uma coluna do tipo VARCHAR(254),
enquanto EclipseLink cria uma coluna do tipo
BLOB(64000) LOGGED NOT COMPACT.
No EclipseLink, essa diferença causa uma java.io.CharConversionException
ao referenciar uma coluna Locale que foi criada por OpenJPA.
Para usar o atributo Locale da mesma maneira que OpenJPA, use um conversor de tipo de persistência Java no EclipseLink.
Essa regra sinaliza atributos do tipo java.util.Locale que não são temporários
e ainda não possuem um conversor.
Para migrar manualmente esse problema, siga estas etapas:
Converter semelhante à classe mostrada no exemplo a seguir.java.util.Locale com a anotação @Convert
e configure o atributo de conversor para a classe de conversor criada.
Por exemplo, essa regra sinaliza o atributo Locale na classe de entidade a seguir:
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; } |
Crie uma classe de conversor.
O exemplo a seguir mostra uma classe de conversor de tipo de amostra 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 o atributo Locale
com a anotação @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; } |
Para obter informações sobre esse problema e outros problemas de migração do OpenJPA para o EclipseLink, consulte o guia Migração do OpenJPA para o EclipseLink JPA: mapeamentos.