Atributy java.util.Locale musí být převedeny

U atributů typu java.util.Locale vytvoří OpenJPA sloupec typu VARCHAR(254), zatímco EclipseLink vytvoří sloupec typu BLOB(64000) LOGGED NOT COMPACT. V EclipseLink tento rozdíl způsobí výjimku java.io.CharConsisionException při odkazování na sloupec Locale, který byl vytvořen OpenJPA. Chcete-li použít atribut Locale stejným způsobem jako OpenJPA, použijte konvertor typu perzistence Java v EclipseLink.

Toto pravidlo označí atributy typu java.util.Locale, které nejsou přechodné a nemají již konvertor. Chcete-li provést ruční migraci tohoto problému, postupujte takto:

  1. Vytvořte třídu Converter podobnou třídě, která je uvedena v následujícím příkladu.
  2. Přidejte třídu převodníku do definice jednotky perzistence.
  3. Anotujte pole java.util.Locale s anotací @Convert a nastavte atribut converter na vytvořenou třídu převodníku.

Toto pravidlo například označí atribut Locale v následující třídě entity:

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;

}

Vytvořte třídu převodníku. Následující příklad zobrazuje stejnou třídu převodníku typů pro 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();
	}

}

Anotujte atribut Locale s anotací @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;

}

Informace o tomto problému a jiných problémech migrace OpenJPA na EclipseLink viz příručka Migrace OpenJPA na EclipseLink JPA: Mapování.