Для атрибутов типа java.util.Locale в OpenJPA создается столбец
типа VARCHAR(254), а в EclipseLink - столбец типа
BLOB(64000) LOGGED NOT COMPACT.
Из-за этого различия в EclipseLink возникает java.io.CharConversionException, если используется ссылка на столбец Locale, созданный OpenJPA.
Для того чтобы использовать атрибут Locale так же, как в OpenJPA, воспользуйтесь преобразователем типа JPA в EclipseLink.
Это правило отмечает атрибуты типа java.util.Locale, которые не являются временными и еще не имеют преобразователя.
Для того чтобы выполнить миграцию вручную, выполните следующие действия:
Converter, аналогичный классу из приведенного ниже примера.@Convert в поле java.util.Locale и задайте в атрибуте converter созданный ранее класс преобразователя.
Ниже приведен пример атрибута Locale в классе сущности, который отметит это правило:
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; } |
Создайте класс преобразователя.
Ниже приведен пример класса преобразователя типа 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(); } } |
Добавьте аннотацию @Convert в атрибут Locale.
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; } |
Для получения дополнительной информации об этой проблеме и других проблемах, возникающих при миграции OpenJPA в EclipseLink, обратитесь к руководству Миграция OpenJPA в EclipseLink JPA: преобразования.