Необходимо преобразовать атрибуты java.util.Locale

Для атрибутов типа 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, которые не являются временными и еще не имеют преобразователя. Для того чтобы выполнить миграцию вручную, выполните следующие действия:

  1. Создайте класс Converter, аналогичный классу из приведенного ниже примера.
  2. Добавьте класс преобразователя в определение единицы хранения.
  3. Добавьте аннотацию @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: преобразования.