java.util.Locale-Attribute müssen konvertiert werden

Für Attribute des Typs java.util.Locale erstellt OpenJPA eine Spalte des Typs VARCHAR(254), wohingegen EclipseLink eine Spalte des Typs BLOB(64000) LOGGED NOT COMPACT erstellt. In EclipseLink führt dieser Unterschied zu einer Ausnahme des Typs java.io.CharConversionException, wenn Sie eine Locale-Spalte, die von OpenJPA erstellt wurde, referenzieren. Verwenden Sie einen Converter für Java-Persistenztypen in EclipseLink, um das Attribut Locale auf die selbe Art wie in OpenJPA nutzen zu können.

Diese Regel markiert Attribute des Typs java.util.Locale, die nicht transient sind und noch keinen Converter haben. Führen Sie die folgenden Schritte aus, um dieses Problem manuell zu beheben:

  1. Erstellen Sie eine Converter-Klasse, die der folgenden Beispiel gezeigten Klasse gleicht.
  2. Fügen Sie der Persistenzeinheitendefinition die Converter-Klasse hinzu.
  3. Annotieren Sie das Feld java.util.Locale mit der Annotation @Convert und setzen Sie das Converterattribut auf die Converter-Klasse, die Sie erstellt haben.

Diese Regel markiert beispielsweise das Attribut Locale in der folgenden Entitätsklasse:

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;

}

Erstellen Sie eine Converter-Klasse. Im Folgenden sehen Sie eine Beispiel-Converter-Klasse für 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();
	}

}

Annotieren Sie das Attribut Locale mit der Annotation @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;

}

Informationen zu diesem Problem und zu weiteren Problemen bei der Migration von OpenJPA auf EclipseLink finden Sie in der Veröffentlichung OpenJPA to EclipseLink JPA Migration: Mappings.