Les attributs java.util.Locale doivent être convertis

Pour les attributs de type java.util.Locale, OpenJPA crée une colonne du type VARCHAR(254), tandis qu'EclipseLink crée une colonne du type BLOB(64000) LOGGED NOT COMPACT. Dans EclipseLink, cette différence génère une exception java.io.CharConversionException lorsque vous référencez une colonne Locale créée par OpenJPA. Pour utiliser l'attribut Locale de la même manière qu'OpenJPA, utilisez un convertisseur de type de persistance Java dans EclipseLink.

Cette règle marque les attributs du type java.util.Locale qui ne sont pas transitoires et n'ont pas déjà un convertisseur. Pour migrer manuellement ce problème, procédez comme suit :

  1. Créez une classe Converter similaire à celle de l'exemple suivant.
  2. Ajoutez la classe de convertisseur à la définition d'unité de persistance.
  3. Annotez la zone java.util.Locale avec l'annotation @Convert et définissez l'attribut de convertisseur sur la classe de convertisseur que vous avez créée.

Par exemple, cette règle marque l'attribut Locale dans la classe entité suivante :

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;

}

Créez une classe de convertisseur. Ci-dessous figure un exemple de classe de convertisseur de type pour 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();
	}

}

Annotez l'attribut Locale avec l'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;

}

Pour des informations sur ce problème et d'autres problèmes de migration d'OpenJPA vers EclipseLink, voir le guide OpenJPA to EclipseLink JPA Migration: Mappings.